拷贝构造函数:
如果一个构造函数的第一个参数是自身类类型的引用,且任何额外参数都有默认值,则此构造函数是拷贝构造函数。
class Foo
{
public:
Foo(); // 默认构造函数
Foo(const Foo &); // 拷贝构造函数
// ...
};
一般情况,拷贝构造函数会将其参数的成员逐个拷贝到正在创建的类对象中。编译器从给定对象中依次将每个非static成员拷贝到正在创建的对象中。如何拷贝呢?对类类型的成员,会使用其拷贝构造函数来拷贝;内置类型的成员则直接拷贝第一个bits。什么时候调用拷贝构造函数呢?
(1)当用类的一个对象初始化该类的另一个对象时;
A a(2);
A b(a); // C++ 风格
A b = a; // C风格
(2)将一个对象作为实参传递给一个非引用类型的形参时;
(3)从一个返回类型为非引用类型的函数返回一个对象时;
(4)用花括号列表初始化一个数组中的元素或一个聚合类中的成员时;
(5)其他需要产生一个临时类对象时。
关于拷贝构造函数与拷贝赋值操作符的区别:
两都都是用已存在的对象A来初始化另一个对象B。不同之处在于:
拷贝构造函数是针对一个未存在的对象进行初始化;拷贝赋值是针对已存在的对象进行初始化。
A a;
A b = a; // 拷贝构造
----------------------------
A a;
A b;
b = a; // 拷贝赋值