编写类string的构造函数、析构函数和赋值函数

[cpp]  view plain  copy
  1. #include<iostream>  
  2. using namespace std;  
  3. class String  
  4. {  
  5. public:  
  6.     String(const char *str=NULL);            //普通构造函数  
  7.     String(const String &other);             //复制构造函数  
  8.     ~String(void);                           //析构函数  
  9.     String & operator=(const String &other);//赋值函数  
  10. private:  
  11.     char *m_String;                        //私有成员,保存字符串  
  12. };  
  13. String::String(const char *str)  
  14. {  
  15.     cout<<"普通构造函数"<<endl;  
  16.     if(str==NULL)                         //如果str为空,存空字符串  
  17.     {  
  18.         m_String=new char[1];             //分配一个字节  
  19.         *m_String='\0';                  //将之赋值为字符串结束符  
  20.     }  
  21.     else  
  22.     {  
  23.         m_String=new char[strlen(str)+1]; //分配空间容纳str内容  
  24.         strcpy(m_String,str);             //赋值str到私有成员   
  25.     }  
  26. }  
  27. String::String(const String &other)  
  28. {  
  29.     cout<<"复制构造函数"<<endl;  
  30.     m_String=new char[strlen(other.m_String)+1];  
  31.     strcpy(m_String,other.m_String);  
  32. }  
  33. String::~String(void)  
  34. {  
  35.     cout<<"析构函数"<<endl;  
  36.     if(m_String!=NULL)                    //如果m_String 不为NULL,释放堆内存  
  37.     {  
  38.         delete [] m_String;              //释放后置为NULL  
  39.         m_String=NULL;  
  40.     }  
  41. }  
  42. String & String::operator =(const String &other)  
  43. {  
  44.     cout<<"赋值函数"<<endl;  
  45.     if(this==&other)                   //如果对象与other是同一个对象  
  46.     {  
  47.         return *this;                  //直接返回本身  
  48.     }  
  49.     delete [] m_String;  
  50.     m_String=new char[strlen(other.m_String)+1];  
  51.     strcpy(m_String,other.m_String);  
  52.     return *this;  
  53. }  
  54. int main()  
  55. {  
  56.     String a("hello");           //调用普通构造函数  
  57.     String b("word");            //调用普通构造函数  
  58.     String c(a);                 //调用复制构造函数  
  59.     c=b;                         //调用赋值函数  
  60.     return 0;  
  61. }  

说明:
(1)普通构造函数:这里判断了传入的参数是否为NULL,如果是NULL,初始化一个字节的空字符串(包括结束符'\0');如果不是,分配足够大小长度的堆内存来保存字符串。
(2)复制构造:只是分配足够小长度的堆内存来保存字符串。
(3)析构函数:如果类私有成员m_String不为NULL,释放m_String指向的堆内存,并且为了避免产生野指针,将m_String赋值为NULL。

(4)赋值函数:首先判断当前对象与引用传递对象是否是同一个对象,如果是,不做操作,直接返回;否则,先释放当前对象的堆内存,然后分配足够大小长度的堆内存复制字符串。

原博客地址:http://blog.csdn.net/qq_21905401/article/details/52267788

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值