c++类的三剑客拷贝构造、拷贝赋值、析构

类中的成员变量包含指针时,需要自定义拷贝构造函数和拷贝赋值函数以避免浅拷贝导致的问题。浅拷贝可能导致多个对象共享同一块内存,形成别名,容易引发错误。同时,未被引用的原始内存可能变成悬挂指针,造成内存泄漏。深拷贝则会为每个对象分配独立的内存空间,确保数据安全。此外,析构函数也需要妥善处理指针的释放。引用可以避免这些问题,因为它不占空间且不会引起别名。

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

在类中的成员变量包含指针,必须自定义拷贝构造函数、拷贝赋值函数、析构函数(?)

介绍:类A的对象a,b        而且类有指针变量,场景:没有自己定义        其实这也就是浅拷贝

当把b赋值给a,那么a对象的成员指针就会由原来构造时指的对象转变指向b的指针对象所指向的内容。(也就是简单的把b的指针地址赋值给a)

也就是A指针所指向的内容,现在有两个指针指着,相当于内容被取别名,注意啊,取别名在编程的时候很容易出问题(大佬侯捷讲的),然后就是一般取别名都使用引用,简单来说,引用不占空间,以及易读。

还有,之前a所指向的内容,现在没有指针指着,那就成了一个孤儿了,也就成了悬浮指针。出现内存泄漏。

改进:使用自己定义的拷贝构造和拷贝赋值                                                其实这也就是深拷贝

//简单的伪代码,就看个思想就好了
String(const char* cstr = 0){
    char* t = new char[strlen(cstr.m_data) +1];
    strcpy(*t, *cstr);
    this.m_data = *t;
}

String(const String& str);	//传入的 是类对象本身

String& operator=(const String& str);	//赋值参数,且参数是类对象本身
String& String::operator= (const String& str)

{

​	if(this == &str)            //这两行代码是有必要的

​			return *this;		//不仅仅是效率,也是正确性,两个是指同一个东西,但释放后,怎么知道要开辟多大空间,怎么赋值?

delete [] m_data;                //释放原有的内容

m_data = new char [strlen(str.m_data) + 1];    //重新开辟与要拷贝的内容同大小空间

strcpy(m_data, str.m_data);                    //复制

return *this;

}

~String();

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值