使用另一个(现有)对象创建新对象时会发生什么?
What happens when a new object is created using another (existing) object?
我看过一本书,上面说:
当我们使用另一个初始化新创建的对象时 - 使用复制构造函数创建一个临时对象,然后使用赋值运算符将值复制到新对象!
后来在书中我读到:
当使用另一个对象初始化新对象时,编译器创建一个临时对象,使用复制构造函数将其复制到新对象。临时对象作为参数传递给复制构造函数。
真是一头雾水,究竟是怎么回事!!
我认为这些说法都不正确 - 没有调用复制赋值运算符。
我会将发生的事情描述为:
当您创建一个新对象作为现有对象的副本时,将调用复制构造函数:
// creation of new objects
Test t2(t1);
Test t3 = t1;
只有当您分配给一个已经存在的对象时才会调用复制赋值运算符
// assign to already existing variable
Test t4;
t4 = t1;
我们可以用下面的小例子来证明这一点:
#include <iostream>
class Test
{
public:
Test() = default;
Test(const Test &t)
{
std::cout << "copy constructor\n";
}
Test& operator= (const Test &t)
{
std::cout << "copy assignment operator\n";
return *this;
}
};
int main()
{
Test t1;
// both of these will only call the copy constructor
Test t2(t1);
Test t3 = t1;
// only when assigning to an already existing variable is the copy-assignment operator called
Test t4;
t4 = t1;
// prevent unused variable warnings
(void)t2;
(void)t3;
(void)t4;
return 0;
}
输出:
copy constructor
copy constructor
copy assignment operator
我看过一本书,上面说: 当我们使用另一个初始化新创建的对象时 - 使用复制构造函数创建一个临时对象,然后使用赋值运算符将值复制到新对象!
后来在书中我读到: 当使用另一个对象初始化新对象时,编译器创建一个临时对象,使用复制构造函数将其复制到新对象。临时对象作为参数传递给复制构造函数。
真是一头雾水,究竟是怎么回事!!
我认为这些说法都不正确 - 没有调用复制赋值运算符。
我会将发生的事情描述为:
当您创建一个新对象作为现有对象的副本时,将调用复制构造函数:
// creation of new objects
Test t2(t1);
Test t3 = t1;
只有当您分配给一个已经存在的对象时才会调用复制赋值运算符
// assign to already existing variable
Test t4;
t4 = t1;
我们可以用下面的小例子来证明这一点:
#include <iostream>
class Test
{
public:
Test() = default;
Test(const Test &t)
{
std::cout << "copy constructor\n";
}
Test& operator= (const Test &t)
{
std::cout << "copy assignment operator\n";
return *this;
}
};
int main()
{
Test t1;
// both of these will only call the copy constructor
Test t2(t1);
Test t3 = t1;
// only when assigning to an already existing variable is the copy-assignment operator called
Test t4;
t4 = t1;
// prevent unused variable warnings
(void)t2;
(void)t3;
(void)t4;
return 0;
}
输出:
copy constructor copy constructor copy assignment operator