以下代码片段的说明C++



我正在阅读C++11常见问题解答并遇到了此代码。我对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;
        // ...
    };
  • "所有权转让"是什么意思?
  • 为什么复制 ctor 等同于"delete"?它有什么用?

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

它是一个

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

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

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

在C++中,你有复制构造函数和复制运算符,如果你的对象很大,它们会很昂贵。 现在在 C++11 中,您有移动构造函数和移动运算符,它们说"从源代码中获取所有内容并杀死它"。

mybigthing y ;
...
mybigthing x( move(y)) ;

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函数中本地存在。它的内容正在移动到返回值中。如果Astd::string的typedef,则意味着字符串内部已被移动,而不是故意复制较长的字符串(可能是html页面(。但是我相信字符串有一个写入标志的副本,所以它在这种情况下不会复制,但其他类可能不会费心在写入时实现副本。

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

关于你的第二个问题:为什么复制 ctor 等同于"删除"?它有什么用?

这是一个答案:http://www.developerfusion.com/article/133063/constructors-in-c11/

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

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

类 MyClass { public: MyClass(( = 删除; };

最新更新