- 此问题在此处已有答案**:
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调用呢?
2条答案
按热度按时间sr4lhrrt1#
声明:
Car car2 = car1;
不是赋值,就像你想的那样。赋值只能发生在一个已经存在的对象上,而不是在一个对象被创建的时候。
上面的语句实际上是initialization,特别是Copy Initialization:
语法
T object = other;
(1)...
拷贝初始化的效果是:
T
是类类型,并且other
类型的cv未限定版本是T
或从T
派生的类,则检查T
的non-explicit constructors,并通过重载解析选择最佳匹配。然后调用该构造函数来初始化对象。因此,在您的情况下,编译器发现复制构造函数是匹配的,并将语句 * 视为 * 您编写的
Car car2(car1);
。这就是调用复制构造函数的原因。
ewm0tg9j2#
C++编译器只会为已经存在的对象调用赋值运算符,以便用另一个示例的值覆盖该对象的值。
在以下情况下,它将调用复制构造函数:
1.如果对象是用另一个示例初始化的。
1.如果将对象作为非引用参数传递给函数。
在这里,您可以看到func的参数,其中obj 2正在被初始化,但尚未赋值。
1.一个对象从一个函数返回--我还不知道这一点。
初始化是指创建新对象或变量以保存值,赋值是指将现有对象或变量设置为保存新值。
对于上面的赋值运算符示例,
car1
和car2
对象在创建时都持有一个值(可能是垃圾),然后被设置为一个新值。