类string的拷贝构造函数与赋值函数

本文详细探讨了C++编程中字符串类String的复制构造函数和赋值构造函数的工作原理,解释了在类包含指针数据成员时,如何正确实现这些构造函数以避免数据泄露和内存错误。通过实例演示,帮助开发者理解并正确使用这些构造函数。

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

    //参考高质量c++编程

复制构造函数

 1   String ::String (const String &other)
 2  {
 3  
 4 
 5      int length=strlen(other.m_date);    
 6                                          //other对象的字符长度,其不包括‘\0’
 7      m_data=new char[length+1];         
 8                                          //在堆上开辟一块内存,内存大小包括'\0'
 9     strcpy(m_data,  other.m_data);   
10    
11  }

 

赋值构造函数

 1  String &String operate=(const String &other)
 2  {
 3        if(this==&other)
 4               return *this;             //自赋值检测
 5       
 6       delete[] m_data;                  //清除原有内存
 7       int length=strlen(other.m_date);    
 8                                        //other对象的字符长度,其不包括‘\0’
 9       m_data=new char[length+1];         
10                                       //在堆上开辟一块内存,内存大小包括'\0'
11      strcpy(m_data,  other.m_data);   
12      
13     return *this;     
14  }

 

 

String a("hello");   //调用default构造函数。

String b=a;         //调用copy构造函数,初始化。

String c;

c=a;                  //调用赋值构造函数

 

当类中有指针数据成员,不能使用系统默认的复制构造函数和赋值构造函数。

      缺省的函数采用位复制,也就是仅仅赋值地址的内容, 也即意味着 执行c.m_data = a.m_data; 

其结果是:

            (1),c.m_data的原有内存没有释放    (没有执行delete[] m_data; 清除原有内存)

            (2),c与a的m_data指向同一块内存,改动一个会影响另一个。 (没有执行m_data=new char[length+1]; strcpy(m_data, other.m_data); )

            (3),当对象呗析构时,m_data被释放两次。

转载于:https://www.cnblogs.com/shewell/p/5352293.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值