对象赋值问题帮你理解C++四大函数

版权声明

请尊重原创作品。转载请保持文章完整性,并以超链接形式注明原始作者“tingsking18”和主站点地址,方便其他朋友提问和指正。

先来看这样一段代码:

class test

{

public:

test(void) {p = new int; }

~test(void) {delete p; p = 0; }

private:

int *p;

};

正如我们平常使用一样,在类的构造函数中new指针,在析构函数中delete指针。表面上看这段代码没有任何问题,实际上却隐藏着很大的隐患。

当我们这样使用上面的类时:

int main(void)

{

test t1;

test t2 = t1;

test t3;

t3 = t2;

return 0;

}

这里test的构造函数调用了两次。t1t3test的析构函数却调用了3次。t1,t2,t3。由于t1,t2,t3分别包含一个指针。他们的指向为t1构造的时候分配的内存。

这样就产生了狠严重的问题。

1. t3构造时创建的内存没有被保存下来,这样就造成了内存泄露。

2. 由于上面调用了析构函数3次,也就是说,t1创建的指针要释放3次。这样就会出现很严重的问题。

好了,找到了问题,我们就知道如何来修改了。

class test

{

public:

test(void) {p = new int; }

~test(void)

{

delete p;

p = 0;

}

test(const test &t)

{

p = new int;

*p = *(t.p);

}

test& operator=(const test &t)

{

if (this != &t)

{

delete p;

p = new int;

*p = *(t.p);

}

return *this;

}

private:

int *p;

};

如果这段代码你理解的很透彻,那么C++中的4大函数你就已经完全掌握了。

test t;调用构造函数。

test t1(t);调用拷贝构造函数

test t2 = t1; 同样调用拷贝构造函数

test t3;

t3 = t1;这里才是调用赋值函数

你可能感兴趣的:(C++,c,C#)