当自定义的类中没有定义拷贝构造函数是,编译器会自动为这个类创建一个。
例如在类 A 中
class A
{
}
编译器会为它创建一个拷贝构造函数(当然不只创建这一个函数另外还有缺省构造、析构函数(一般是非虚的)、&重载、const & 重载、=重载)。
class A
{
A(const A& a)
{
...
}
}
编译器首先检测该类中有没有此构造函数如有的话则编译器不做处理,若没有则创建。
自动创建的函数里的工作就是对该类中的非静态变量进行逐一拷贝。
在对象在执行拷贝的时候则调用该函数,若类 A 为一个派生类,那么该规则适合于每一层父类。
当类 A 中有 string 成员的时候,编译器会调用 string 的拷贝函数,当成员变量没有拷贝函数时,例如 int 类型,那么它将拷贝每一个比特位来进行初始化。
当类中有个成员变量是引用的时候,比如是 string & 的时候,编译器会为它生成赋值运算符的函数吗?我们可以来提编译器考虑一下:加入是可以生成那该如何去做,引用本身能够被改变吗?换句话说就是将它指向改变,不能,引用是很专一的。那将引用指向的内容改变?如果改变了,那么指向这块内存的所有指针和引用都会受到影响,后果将是无法想象的。两种方式都不行,怎么办?惹不起还躲不起吗,我不干了。于是编译器就不去生成这个赋值函数了,那么这个函数就需要程序员自己来实现。