1. 拷贝构造函数:
- 用一个对象初始化(创建)另一个对象,拷贝构造函数是把对象当中参数传入,利用传入的对象生成一个新的对象的实例,而赋值运算符是将对象的值赋值给一个已经存在的实例。
- 拷贝构造函数的功能是使用对象创建一个对象实例,也就是说使用对象初始化另一个新的对象,赋值运算符是将一个对象的值赋值给另一个已经存在的对象。
- 调用的是拷贝构造函数还是赋值运算符,主要看是否有新的对象产生。
2. 使用场景:
- 使用一个对象给另一个对象初始化
- 对象作为函数的返回值以值的方式从函数返回
- 对象作为函数参数,以值传递的方式传给函数
//解释第二条第三条:
//当对象作为函数的返回值时:因为局部变量a在函数结束时会被释放,所以编译器会额外拷贝出来一份a供我们使用;
//当对象c当作函数参数以值传递的形式传给函数S时,对象c会对对象a进行初始化,即使用一个对象初始化另一个对象,故调用拷贝构造函数;
3. 语法:
类名 (const 类名 &外部对象名) { }
//const是为了防止 在函数体里面修改外部对象;
//& 是为了防止陷入递归;
4. 为何拷贝构造函数参数需要 &?
- 当对象以值传递的方式作为函数参数时,会调用拷贝构造函数;
- 当对象以引用的方式作为函数参数时,因为和实参共用一个内存,不会产生新的对象,所以不会调用构造函数,故不会递归;
- 如果构造函数的参数是值传递的话,在初始化拷贝构造函数的参数时就会发生用实参去初始化一个新的对象(形参),进而会继续调用构造函数初始化形参,因此会形成无限递归。
- 所以const是为了防止 在函数体里面修改外部对象,& 是为了防止陷入无限递归。