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

本文通过具体实例分析了C++中拷贝构造函数与赋值操作符的重要性,阐述了深拷贝与浅拷贝的区别及其带来的问题,特别是针对含有指针成员变量的类。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

版权声明

请尊重原创作品。转载请保持文章完整性,并以超链接形式注明原始作者“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;这里才是调用赋值函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值