gre*_*eth 19 c++ copy-constructor
如果operator=正确定义,可以使用以下作为复制构造函数吗?
MyClass::MyClass(MyClass const &_copy)
{
*this = _copy;
}
Run Code Online (Sandbox Code Playgroud)
Ale*_* C. 27
如果所有成员MyClass都有默认构造函数,那么.
请注意,通常它是相反的方式:
class MyClass
{
public:
MyClass(MyClass const&); // Implemented
void swap(MyClass&) throw(); // Implemented
MyClass& operator=(MyClass rhs) { rhs.swap(*this); return *this; }
};
Run Code Online (Sandbox Code Playgroud)
我们传递值,operator=以便调用复制构造函数.请注意,一切都是异常安全的,因为swap保证不会抛出(您必须在实现中确保这一点).
根据要求编辑有关按值调用的内容:operator=可以写成
MyClass& MyClass::operator=(MyClass const& rhs)
{
MyClass tmp(rhs);
tmp.swap(*this);
return *this;
}
Run Code Online (Sandbox Code Playgroud)
C++学生通常被告知通过引用传递类实例,因为如果通过值传递复制构造函数,则会调用它.在我们的情况下,rhs无论如何我们必须复制,所以通过值传递是好的.
因此,operator=(第一个版本,按值调用)读取:
rhs(通过复制构造函数,自动调用)*this *this和let rhs(包含旧值)在方法退出时被销毁.现在,我们通过这个按值调用获得额外奖励.如果传递给的对象operator=(或通过值获取其参数的任何函数)是临时对象,则编译器可以(并且通常)根本不进行复制.这称为复制省略.
因此,如果rhs是临时的,则不进行复制.我们留下:
this和rhs内容rhs因此,在这种情况下,通过值传递比通过引用传递更有效.
Ste*_*end 11
根据异常安全拷贝构造函数,更可取的是实现operator =.参见Herb Sutter的实施例4.对该技术的解释以及为什么这是一个好主意.
http://www.gotw.ca/gotw/059.htm
此实现意味着所有数据成员(和基类)的默认构造函数都可以从MyClass中访问和访问,因为在进行赋值之前将首先调用它们.即使在这种情况下,对构造函数进行额外调用也可能很昂贵(取决于类的内容).
我仍然坚持通过初始化列表单独实现复制构造函数,即使这意味着编写更多代码.
另一件事:此实现可能有副作用(例如,如果您有动态分配的成员).