class MyClass
{
public:
~MyClass() {}
MyClass():x(0), y(0){} //default constructor
MyClass(int X, int Y):x(X), y(Y){} //user-defined constructor
MyClass(const MyClass& tempObj):x(tempObj.x), y(tempObj.y){} //copy constructor
private:
int x; int y;
};
int main()
{
MyClass MyObj(MyClass(1, 2)); //user-defined constructor was called.
MyClass MyObj2(MyObj); //copy constructor was called.
}
在第一种情况下,当MyClass(1, 2)
调用用户定义的构造函数并返回一个对象,我期待着MyObj
调用复制构造函数。为什么不需要为第二个实例调用复制构造函数MyClass
?
每当创建临时对象的唯一目的是复制并随后销毁时,编译器就可以完全删除临时对象并直接在接收者中构造结果(即直接在应该接收副本的对象中)。在你的情况下
MyClass MyObj(MyClass(1, 2));
可以转化为
MyClass MyObj(1, 2);
即使复制构造函数有副作用。
这个过程称为省略复制操作。它在语言标准12.8/15中有描述。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)