在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构造函数注释掉试试。