在C++中,自定义类,在把类的一个实体赋值给另外一个同类型的变量对象是,系统会自动完成构造函数的,即使我们没有提供默认的构造函数,因为系统会自动产生一个构造函数。譬如如下的定义与使用:
struct TestData { int age; TestData(int g) { age = g; } // 系统产生的默认构造函数跟这个是一样的 TestData(TestData &c) { // 注释掉这个试试,下面的输出会产生一个奇怪的输出 age = c.age; } TestData(const TestData &c) { age = c.age; } ~TestData() { } };
使用:
TestData aa(99);
TestData bb = aa;
CCLOG(“TestData:%d”,bb.age);
上面的定义Copy构造函数,跟不定义都没有关系。但是如果类内有通过在堆上产生的数据,在析构函数体内是需要delete的,此时如果用赋值的方法,给另外一对象,因为在堆上生成的内存,此时只有一份内存,如果产生两次析构。会使程序产生异常的。因此,我们此时需要自定义Copy构造函数了。
struct TestData { Node* node; TestData(int g) { age = g; node = new Node(); } // 系统产生的默认构造函数跟这个是一样的 TestData(TestData &c) { age = c.age; //node = c.node; node = new Node(); } ~TestData() { delete = node; } };
,还是如上的测试方法。如果你把自定义的copy构造函数注释掉试试。