[英]Why is my copy constructor not working? (C++)
我正在研究 C++ 并创建了这个简单的代码来练习复制构造函数。
class Cube{
private:
double length;
public:
Cube(){
length = 1;
cout << "default constructor called" << endl;
};
Cube(const Cube& obj){
length = obj.length;
cout << "copy constructor called" << endl;
};
};
Cube foo(){
Cube c;
return c;
}
int main(){
Cube c2 = foo();
return 0;
}
我希望这能打印出来
“调用默认构造函数”
“调用复制构造函数”
“调用复制构造函数”
因为默认构造函数在“Cube C”中调用,而复制构造函数在“return c”和“Cube c2 = foo()”中调用。
但是我的控制台只显示“调用默认构造函数”
我是否误解了复制构造函数的工作原理?
这不会调用您的复制构造函数,而是将 foo 中创建的 object 初始化为 c2。
Cube c2 = foo();
这将调用 = 赋值运算符:
Cube c2; // default constructor
c2 = foo(); // default constructor inside foo() and then assignment operator
这将调用复制构造函数:
Cube c3; // default constructor
Cube c2(c3); // copy constructor
复制构造函数的语法如下:
Cube(const Cube& obj)
它是一个构造函数,用于从另一个 object 创建 object 的副本。
但是我的控制台只显示“调用默认构造函数”
因为复制省略。
你的期望是对的。 概念上有两种复制结构,第一种用于return c;
, 复制初始化c
的返回值; 第二个是Cube c2 = foo();
,从foo()
的返回值 复制初始化c2
。 由于复制省略,它们都被省略了,然后根本不调用复制构造函数。
对于第一个,
在返回语句中,当操作数是具有自动存储期限的非易失性 object 的名称时,它不是 function 参数或 catch 子句参数,并且与 ZA2F2ED4F8EBC2CBB164C21A29-qualification 类型相同function 返回类型。 这种复制省略的变体被称为 NRVO,“命名返回值优化”。
对于第二个,
在 object 的初始化中,当初始化表达式是与变量类型相同的 class 类型(忽略 cv 限定)的纯右值时:
T x = T(T(f())); // only one call to default constructor of T, to initialize x
请注意,第二个是强制性的,因为 C++17。
顺便说一句:使用-fno-elide-constructors
选项(以避免潜在的复制省略)在 C++17 之前的模式下编译(以避免强制复制省略)会得到您预期的结果。 与 gcc 一起直播
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.