在以下代码中调用了哪个构造函数?
在以下代码中调用了哪个构造函数?
请看下面的代码:\nclass Test\n{\npublic:\n Test()\n {\n cout << \"default\\n\";\n }\n Test(const Test&)\n {\n cout << \"copy\\n\";\n }\n Test& operator = (const Test&)\n {\n cout << \"assign\\n\";\n return *this;\n }\n};\nint main()\n{\n Test t = Test();\n}\n在主函数中应该调用哪个构造函数?\n我运行代码,只打印了\"default\",没有其他输出。然而,如果我将复制构造函数和赋值运算符设为私有,代码就无法编译。但是,它根本没有使用那个构造函数。\n应该使用哪个构造函数?这是否被标准保证?这是我不知道的规则吗?\n实时代码示例:\nhttp://ideone.com/lnUEA1\nhttp://ideone.com/nXjAo4
问题的出现原因:
代码中使用了复制初始化(copy initialization),这意味着需要提供一个可用的复制构造函数(copy constructor)。理论上,默认构造函数和复制构造函数都会被调用。然而,编译器有权优化掉不必要的复制操作。
解决方法:
为了确保复制构造函数被调用,可以采取以下两种解决方法之一:
1. 显式地定义一个复制构造函数,以确保编译器不会优化掉它。
2. 使用
关键字来禁用编译器的优化,强制调用复制构造函数。
示例代码如下:
class MyClass {
public:
MyClass() = default; // 默认构造函数
MyClass(const MyClass&) = default; // 复制构造函数
// ...
};
int main() {
MyClass obj = MyClass(); // 使用复制初始化
// ...
}
通过显式定义复制构造函数或使用关键字,可以确保复制构造函数被调用,从而解决问题。