C++ 解释下面的代码段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
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{