提问人:Mohamed Salah 提问时间:6/27/2021 更新时间:6/27/2021 访问量:375
C++ 中的复制构造函数和赋值运算符 [已关闭]
copy constructor and assignment operator in C++ [closed]
问:
class MyClass
{
private:
int x;
public:
MyClass(int x)
{
this->x = x;
}
MyClass(const MyClass& other)
{
this->x = other.x;
}
};
int main()
{
MyClass first(1);
MyClass second = first; //(1)
first = second; // (2)
MyClass third = MyClass(2); // (3)
}
为什么第一行调用复制构造函数,第二行调用赋值运算符,以及为什么第三行通过调用复制构造函数而不像第一行那样起作用。
当然,第 3 行到底是做什么的.MyClass second = first
first = second;
MyClass third = MyClass(2);
MyClass third = MyClass(2);
答:
构造函数(包括复制构造函数)用于初始化类对象。赋值运算符用于修改已初始化的对象。
第 (1) 行调用复制构造函数,因为它正在初始化对象。赋值运算符与符号也在此语法中使用这一事实无关。行 (2) 赋值已存在,因此使用赋值运算符。second
=
first
在 C++14 及更早版本的第 (3) 行中,允许编译器为表达式创建临时对象,然后使用复制构造函数初始化,然后销毁临时对象。但是编译器也可以“省略”(删除)临时对象、复制构造函数和临时析构函数,只需以与原始临时对象相同的方式直接初始化即可。这种复制省略是 C++ 允许优化的一种情况,这可能会导致可观察行为的差异,因为复制构造函数和/或析构函数可能具有优化跳过的副作用(如打印痕迹)。MyClass(2)
third
third
在 C++17 及更高版本的第 (3) 行中,我们说表达式具有结果对象。因此,表达式指定使用参数直接初始化。不涉及复制构造函数或临时对象。C++17 的这一特性通常被称为“强制复制省略”,因为其行为与编译器能够应用复制省略优化的 C++14 程序相同。但从技术上讲,这不是复制省略,因为不涉及要省略的副本。还有一些其他情况,对于编译器来说,复制省略是可选的。MyClass(2)
third
third
2
评论
=
=
=
=
*
&