C++ 拷贝构造函数
拷贝构造函数是一种特殊的构造函数,它在创建对象时,是使用同一类中之前创建的对象来初始化新创建的对象。
通常用于:
通过使用另一个同类型的对象来初始化新创建的对象。
复制对象把它作为参数传递给函数。
复制对象,并从函数返回这个对象。
如果在类中没有定义拷贝构造函数,编译器会自行定义一个。如果类带有指针变量,并有动态内存分配,则它必须有一个拷贝构造函数。
以上来自:https://www.runoob.com/cplusplus/cpp-copy-constructor.html
定义一个类:
class TestClass { public: int GetNum(); void SetNum(int a); //构造函数 TestClass(int a); //拷贝构造函数 TestClass(const TestClass& t); //析构函数 ~TestClass(); private: int* ptr; }; int TestClass::GetNum() { return *ptr; } void TestClass::SetNum(int a) { *ptr = a; } TestClass::TestClass(int a) { ptr = new int; *ptr = a; printf("创建对象"); } TestClass::TestClass(const TestClass& t) { ptr = new int; *ptr = *(t.ptr); } TestClass::~TestClass() { delete ptr; printf("调用析构函数! "); }
main函数:
int nain() { TestClass t = TestClass(2); TestClass t2(t); return 0; }
t2对象创建的时候调用的是自己定义的拷贝构造函数。
如果这里不手动创建拷贝构造函数而是让编译器自己创建的话会出问题,这里是因为类的私有成员变量是一个指针,使用自动的拷贝构造函数的话,实际上是以浅拷贝的方式对新对象初始化的,这样带来的问题就是这个成员指针只是简单的保存地址,并没有创建新的堆内存,待到用来初始化的对象销毁时在析构函数里释放掉了这部分内存,导致新对象销毁时对这块内存重复的进行了释放,从而带来问题。
上面的不明白可以将类定义中的拷贝构造函数删掉,测试一下就明白了。