通过按值传递的方式传递一个对象时,就创立了一个新对象,函数体内的对象是由函数体外的原来存在的对象传递的。
当编译器需要从现有的对象创建新对象时,可以通过定义自己的函数来实现,因为需要创建新的对象,因此这个函数应该是构造函数,并且传递给这个函数的单一参数必须是创立的对象的源对象,但是该对象不能以按值传递的方式传入构造函数,而是需要以引用的方式来传递,可以使用源对象的引用,这个就是拷贝构造函数
拷贝构造函数的形式是 X(X&),其中,X是类名
使用了拷贝构造函数,就使得编译器在创建新对象时,避免使用位拷贝
默认的拷贝构造函数执行的是位拷贝
仅当准备用按值传递的方式传递类对象时,才需要拷贝构造函数,但是如何避免按值传递呢,那就是将拷贝构造函数声明为私有的,这样就可以防止按值传递。
#include <iostream>
using namespace std;
class NoCC
{
int i;
NoCC(const NoCC&); //声明
public:
NoCC(int ii = 0) : i(ii)
{
}
};
void f(NoCC)
{
}
int main()
{
NoCC n;
//f(n); //error 会调用拷贝构造函数,但是构造函数是私有的,无法调用
//NoCC n2 = n; //error, 同上
//NoCC n3(n); //error, 同上
}