拷贝构造函数是一种特殊的构造函数,用于在创建一个对象时,以另一个同类对象作为初始化值来创建新对象。它的形式如下:
ClassName(const ClassName& obj);
其中,ClassName
是类名,obj
是同类对象的引用。拷贝构造函数通常用于初始化一个对象的副本或者将一个对象作为参数传递给函数。
在C++中,下面几种情况下会调用拷贝构造函数:
- 通过复制构造函数初始化对象
ClassName obj1 = obj2;
这里使用了 obj2
对象来初始化 obj1
,此时会调用拷贝构造函数。
- 将对象作为函数参数传递时,使用对象来初始化新对象。
void func(ClassName obj);
当调用函数 func
时,会将对象 obj
的副本传递给函数。此时会调用拷贝构造函数来初始化新对象。
- 函数返回一个对象时,使用局部对象来初始化新对象。
ClassName func() { ClassName obj; // ... return obj; }
在函数 func()
中,对象 obj
是局部变量,它的生命周期在函数结束时结束。当函数返回时,会使用 obj
对象的副本来初始化新对象,此时会调用拷贝构造函数。
需要注意,如果没有显式定义拷贝构造函数,C++编译器会自动生成一个默认的拷贝构造函数。这个函数按值复制每个成员变量,并将参数对象的值赋给新对象的成员变量。如果类中有指针成员变量,则默认的拷贝构造函数只是复制指针的值,新对象和旧对象将共享同一个内存地址,可能导致内存泄漏或者非法访问问题。因此,在包含指针成员变量的类中,建议显式定义拷贝构造函数来完成深度复制。