Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 解释下面的代码段C++;_C++_C++11_Constructor - Fatal编程技术网

C++ 解释下面的代码段C++;

C++ 解释下面的代码段C++;,c++,c++11,constructor,C++,C++11,Constructor,我在阅读时发现了这个代码。我对C++编码有了更好的理解,但是我仍然不能理解下面的代码。 template<class T> class Handle { T* p; public: Handle(T* pp) : p{pp} {} ~Handle() { delete p; } // user-defined destructor: no implicit copy or move Handl

我在阅读时发现了这个代码。我对C++编码有了更好的理解,但是我仍然不能理解下面的代码。
    template<class T>
    class Handle {
        T* p;
    public:
        Handle(T* pp) : p{pp} {}
        ~Handle() { delete p; } // user-defined destructor: no implicit copy or move 

        Handle(Handle&& h) :p{h.p} { h.p=nullptr; };    // transfer ownership
        Handle& operator=(Handle&& h) { delete p; p=h.p; h.p=nullptr; return *this; }   // transfer ownership

        Handle(const Handle&) = delete;     // no copy
        Handle& operator=(const Handle&) = delete;

        // ...
    };
模板
类句柄{
T*p;
公众:
句柄(T*pp):p{pp}{}
~Handle(){delete p;}//用户定义的析构函数:无隐式复制或移动
Handle(Handle&&h):p{h.p}{h.p=nullptr;};//转移所有权
Handle&operator=(Handle&h){delete p;p=h.p;h.p=nullptr;return*this;}//转移所有权
句柄(const Handle&)=删除;//无副本
句柄和运算符=(常量句柄&)=删除;
// ...
};
  • “转让所有权”是什么意思
  • 为什么复制ctor等同于“
    delete
    ”?它有什么用处

如果有人能添加一些示例并加以解释,那将是一个很大的帮助。

这是一个移动构造函数,C++11中引入的特殊
&&
语法采用右值引用,因此对一个变量的引用没有名称,不能在代码中的任何其他地方引用

构造函数中发生的情况是,
Handle
获取通过move构造函数传递的
Handle
的所有权,它通过将其值分配给自己的变量,然后将
nullptr
设置为传递的右值的变量,从而窃取(将术语传递给我)内部的
T*p


之所以使用它,是因为您实际上不需要复制右值,因为代码中将不再使用该值,因此只获取其数据是安全的,这避免了一个可能代价高昂的复制构造函数。

它是一个移动构造函数,C++11中引入的特殊
&&
语法采用右值引用,因此,对变量的引用没有名称,并且不能在代码中的任何其他地方引用

构造函数中发生的情况是,
Handle
获取通过move构造函数传递的
Handle
的所有权,它通过将其值分配给自己的变量,然后将
nullptr
设置为传递的右值的变量,从而窃取(将术语传递给我)内部的
T*p


这是因为你不需要复制一个rValm,因为这个值在代码中不再被使用,所以只需获取它的数据就安全了,这就避免了一个可能花费很大的复制构造函数。

C++中有拷贝构造函数和拷贝操作符,如果对象很大,则代价很高。现在在C++11中,有了move构造函数和move操作符,它们表示“从源代码中获取所有内容并杀死它”

y是由许多内部内容创建的。在x(y)之后,y现在是空的,所有大的东西都在x中

这样做的主要原因之一是使从函数返回的大对象免费:

mybigthing f()
{
  mybigthing tmp ;
  ...
  return tmp ;
}

{
  mybigthing y= f() ;
}

在c++03中,这在性能方面是非常糟糕的。现在它是免费的。编译器需要实际使用y作为代码“<”()的临时内部(<代码)>,并且不做任何拷贝。C++中的

您有复制构造函数和复制操作符,如果对象较大,则代价很高。现在在C++11中,有了move构造函数和move操作符,它们表示“从源代码中获取所有内容并杀死它”

y是由许多内部内容创建的。在x(y)之后,y现在是空的,所有大的东西都在x中

这样做的主要原因之一是使从函数返回的大对象免费:

mybigthing f()
{
  mybigthing tmp ;
  ...
  return tmp ;
}

{
  mybigthing y= f() ;
}

在c++03中,这在性能方面是非常糟糕的。现在它是免费的。编译器需要实际使用y作为
f()
的临时内部,并且从不进行任何复制。

转移所有权意味着如果您进行
a=b
转移,则
b
的内容属于
a
,不再存在于
b
中。这在示例
{A A;dosomething(A);return A;}
中更有意义<代码>函数中本地存在一个。它的内容正在移动到返回值中。如果
A
std::string
的typedef,则表示字符串内部已被移动,而不是故意复制一个长字符串(可能是html页面)。然而,我相信string有一个copy-on-write标志,所以在这种情况下它不会复制,但其他类可能不会费心实现copy-on-write


构造函数和赋值运算符(移动而不是复制)
delete
的原因是当前的
p
可能指向某个对象。不释放它意味着内存泄漏。

转移所有权意味着如果您这样做
a=b
b
的内容属于
a
,不再存在于
b
中。这在示例
{A A;dosomething(A);return A;}
中更有意义<代码>函数中本地存在一个。它的内容正在移动到返回值中。如果
A
std::string
的typedef,则表示字符串内部已被移动,而不是故意复制一个长字符串(可能是html页面)。然而,我相信string有一个copy-on-write标志,所以在这种情况下它不会复制,但其他类可能不会费心实现copy-on-write


构造函数和赋值运算符(移动而不是复制)
delete
的原因是当前的
p
可能指向某个对象。不释放它意味着内存泄漏。

关于第二个问题: 为什么复制ctor等同于“删除”?它有什么用处

以下是答案:

C++11显式删除的构造函数

C++11还支持显式删除构造函数的概念。 例如,您可以定义一个不想为其编写的类 任何构造函数,您也不希望编译器生成 默认构造函数。在这种情况下,您需要显式删除 默认构造函数:

类MyClass{