考虑下面的示例程序:
#include <iostream>
using namespace std;
class sample
{
private:
int x;
public:
sample(int a=0) : x(a)
{
cout << "default ctor invoked\n";
}
sample(const sample& obj)
{
cout << "copy ctor invoked\n";
}
};
int main()
{
sample s2 = sample(20); //Line1
sample s3 = 20; //Line2
return 0;
}
在Line1
中,首先使用参数20调用sample
类的构造函数explicitly
。然后我希望调用复制构造函数来初始化s2。
在第2行中,首先使用参数20调用sample
类的构造函数implicitly
。这里我也期望调用复制构造函数来初始化s2。
在这两种情况下,都不会调用复制构造函数?为什么会这样?我相信,我对复制构造函数的调用有一些问题。有人能纠正我的错误吗?
答案 0 :(得分:8)
这是预期的。它被称为copy elision。
您的期望是正确的,但是他们在C ++(性能)中做了一个例外,它允许编译器在绕过复制构造函数时将表达式视为一个实例的直接初始化。
答案 1 :(得分:0)
在第一行中它不会调用复制构造函数,因为您不复制对象。您正在将一个对象分配给其他对象。 C ++提供执行浅拷贝的default =运算符。这是隐式调用的。为右手对象调用构造函数,并为左手对象调用默认构造函数。之后调用default =运算符。
对于第2行,它使用构造函数来获取您定义的int参数。它实际上是转换器构造函数,因为它接受一个整数并创建类的对象。这就是为什么c ++使用它作为转换器构造函数,当你尝试为对象分配一个整数时,c ++会明确地调用这个转换器构造函数。
我希望这可以帮助你理解。