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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了类string的拷贝构造函数与赋值函数相关的知识,希望对你有一定的参考价值。

    //参考高质量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被释放两次。

以上是关于类string的拷贝构造函数与赋值函数的主要内容,如果未能解决你的问题,请参考以下文章

C++面试之 类string的构造函数拷贝构造函数和析构函数

拷贝构造函数和赋值运算符的认识

为什么类的拷贝构造参数加引用重载赋值函数的返回值和参数加引用

string类精简版

复制构造函数与赋值运算符(=)有何不同

String类的实现与深浅拷贝问题