c++ 如何(或为什么)调用复制构造函数?[duplicate]

tf7tbtn2  于 2023-02-06  发布在  其他
关注(0)|答案(2)|浏览(214)
    • 此问题在此处已有答案**:

What's the difference between assignment operator and copy constructor?(8个答案)
7小时前关闭.

#include <iostream>

using namespace std;

struct Car
{
    int size = 4;
    int* tires = nullptr;

    Car()
    {
        cout << "ctor" << endl;
        tires = new int[size];
    }

    Car(const Car& car)
    {
        cout << "copy ctor" << endl;
        tires = new int[size];
        memcpy(tires, car.tires, size*sizeof(int));
    }

    Car& operator= (Car& car)
    {
        cout << "copy assignment operator" << endl;
        tires = new int[size];
        memcpy(tires, car.tires, size*sizeof(int));
        return *this;
    }

     ~Car()
    {
        cout << "dtor" << endl;
        delete tires;
    }
};

int main()
{
    cout  << "starting..." << endl;

    Car car1;
    car1.tires[0] = 2;

//    Car car2(car1); // #1
    Car car2 = car1; // #2 I was expecting the assingment operator to be called here

    cout << car1.tires[0] << " " << car2.tires[0] << endl;

    return 0;
}

我理解为什么在#1调用复制构造函数,但是它怎么会在#2调用呢?

sr4lhrrt

sr4lhrrt1#

声明:
Car car2 = car1;
不是赋值,就像你想的那样。赋值只能发生在一个已经存在的对象上,而不是在一个对象被创建的时候。
上面的语句实际上是initialization,特别是Copy Initialization
语法
T object = other;(1)
...
拷贝初始化的效果是:

  • ...
  • 否则,如果T是类类型,并且other类型的cv未限定版本是T或从T派生的类,则检查Tnon-explicit constructors,并通过重载解析选择最佳匹配。然后调用该构造函数来初始化对象。
  • ...

因此,在您的情况下,编译器发现复制构造函数是匹配的,并将语句 * 视为 * 您编写的Car car2(car1);
这就是调用复制构造函数的原因。

ewm0tg9j

ewm0tg9j2#

C++编译器只会为已经存在的对象调用赋值运算符,以便用另一个示例的值覆盖该对象的值。

car car1,car2;
car2=car1;

在以下情况下,它将调用复制构造函数:
1.如果对象是用另一个示例初始化的。

car car1;
  car car2=car1; //This is equivalent to car2(car1);

1.如果将对象作为非引用参数传递给函数。
在这里,您可以看到func的参数,其中obj 2正在被初始化,但尚未赋值。

void func(car obj2)//not a reference parameter(car& obj2)
 {
  //
 }

 car obj1;
 func(obj1);

1.一个对象从一个函数返回--我还不知道这一点。
初始化是指创建新对象或变量以保存值,赋值是指将现有对象或变量设置为保存新值。
对于上面的赋值运算符示例,car1car2对象在创建时都持有一个值(可能是垃圾),然后被设置为一个新值。

相关问题