c/c++整理--类String的构造函数、析构函数和赋值函数

类string的原型

[cpp]  view plain  copy
  1. <span style="font-size:18px;">class string  
  2. {  
  3. public:  
  4.     string(const char* str = NULL);     //普通构造函数  
  5.     string(const string &other);        //复制构造函数  
  6.     ~string(void);                      //析构函数  
  7.     string & operater = (const string &other);  //赋值函数  
  8. private:  
  9.     char *m_string;                     //私有成员,保护字符串  
  10. };</span>  

自己编写String的构造函数、析构函数和赋值函数:

[cpp]  view plain  copy
  1. <span style="font-size:18px;">#include <iostream>  
  2. #include <string.h>  
  3.   
  4. using namespace std;  
  5.   
  6. class String  
  7. {  
  8. public:  
  9.     String(const char* str = NULL);     //普通构造函数  
  10.     String(const String &other);        //复制构造函数  
  11.     ~String(void);                      //析构函数  
  12.     String & operator = (const String &other);  //赋值函数  
  13. private:  
  14.     char *m_string;                     //私有成员,保护字符串  
  15. };  
  16.   
  17. String::~String(void)  
  18. {  
  19.     cout<<"Destructing"<<endl;  
  20.     if(m_string != NULL)                //如果m_string不为NULL,释放内存  
  21.     {  
  22.         delete[] m_string;  
  23.         m_string = NULL;                //释放后置为NULL  
  24.     }  
  25. }  
  26.   
  27. String::String(const char* str)  
  28. {             
  29.     cout<<"Constructing"<<endl;           
  30.     if(str == NULL)                     //如果str为NULL,存字符串""  
  31.     {  
  32.         m_string = new char[1];         //分配一个字节  
  33.         *m_string = '\0';               //赋值为字符串结束符  
  34.     }  
  35.     else  
  36.     {  
  37.         m_string = new char[strlen(str)+1];     //分配空间容纳str  
  38.         strcpy(m_string, str);                  //复制str到私有成员  
  39.     }  
  40. }  
  41.   
  42. String::String(const String& other)  
  43. {  
  44.     cout<<"Constructing Copy"<<endl;  
  45.     m_string = new char[strlen(other.m_string)+1];      //分配空间容纳str内容  
  46.     strcpy(m_string, other.m_string);                   //复制str到私有成员  
  47. }  
  48.   
  49. String & String::operator = (const String& other)  
  50. {  
  51.     cout<<"operator = Function"<<endl;  
  52.     if(this == &other)                                  //如果对象与other是同一个对象  
  53.     {  
  54.         return *this;  
  55.     }  
  56.     delete[] m_string;  
  57.     m_string = new char[strlen(other.m_string)+1];  
  58.     strcpy(m_string, other.m_string);  
  59.     return *this;  
  60. }  
  61.   
  62. int main()  
  63. {  
  64.     String a("hello");  
  65.     String b("world");  
  66.     String c(a);  
  67.     c=b;  
  68.       
  69.     return 0;  
  70. }</span>  
(1)普通构造函数:判断了传入的参数是否为NULL,如果是NULL,初始化一个字节的空字符串(包括结束符‘\0’);如果不是,分配足够大小长度的堆内存来保存字符串。

(2)复制构造函数:只是分配足够大小的堆内存来保护字符串。

(3)析构函数:如果类私有成员m_string不为NULL,释放m_string指向的堆内存,并且为了避免产生野指针,将m_string赋空。

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


执行结果:

[cpp]  view plain  copy
  1. Constructing  
  2. Constructing  
  3. Constructing Copy  
  4. operator = Function  
  5. Destructing  
  6. Destructing  
  7. Destructing  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值