复制构造函数未被调用

Copy Constructor is not invoked

本文关键字:调用 构造函数 复制      更新时间:2023-10-16

可能重复:
为什么在这种情况下不调用复制构造函数?

考虑下面的示例程序:

#include <iostream>
using namespace std;
class sample
{
    private:
        int x;
    public:
        sample(int a=0) : x(a)
        {
            cout << "default ctor invokedn";
        }
        sample(const sample& obj)
        {
            cout << "copy ctor invokedn";
        }
};
int main()
{
    sample s2 = sample(20); //Line1
    sample s3 = 20; //Line2
    return 0;
}

Line1中,首先用参数20调用sample类的构造函数explicitly。然后我期望调用复制构造函数来初始化s2。

在第2行中,首先用参数20调用sample类的构造函数implicitly。在这里,我还期望调用复制构造函数来初始化s2。

在这两种情况下,复制构造函数都没有被调用?为什么会发生这种情况?我相信,我对复制构造函数调用的理解有问题。有人能纠正我哪里出了问题吗?

这是意料之中的事。这叫做复制省略。

您的期望是正确的,但他们在C++中做了一个例外(为了性能),允许编译器将您的表达式视为一个实例的直接初始化,同时绕过复制构造函数。

在第一行中,它不调用复制构造函数,因为您不复制对象。您正在将一个对象指定给另一个对象。C++提供默认=执行浅拷贝的运算符。这是隐含调用的。构造函数是为右手对象调用的,默认构造函数是为左手对象调用的。在调用默认=运算符之后。

对于第2行,它使用构造函数,该构造函数接受您定义的int参数。它实际上是转换器构造函数,因为它接受一个整数并创建类的对象。这就是为什么c++将其用作转换器构造函数的原因,当您尝试为对象分配一个整数时,c++会正确地调用此转换器构造函数。

我希望这能帮助你理解。