Sloppy's Blog

C++的构造与Copy构造

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