码迷,mamicode.com
首页 > 其他好文 > 详细

类String的构造函数(包含一个拷贝构造函数)、析构函数和赋值函数

时间:2015-05-29 20:06:16      阅读:112      评论:0      收藏:0      [点我收藏+]

标签:

每个类只有一个析构函数和一个赋值函数,但可以有多个构造函数(包含一个拷贝构造函数,其它的称为普通构造函数)。

class String
    {
      public:
        String(const char *str = NULL);    // 普通构造函数
        String(const String &other);        // 拷贝构造函数
        ~ String(void);                        // 析构函数
        String & operate =(const String &other);    // 赋值函数
        
        // 相加函数,如果没有friend修饰则只许有一个右侧参数
        friend    String   operate+( const String &s1, const String &s2);

      private:
        char      *m_data;                // 用于保存字符串
    };

// String的析构函数
    String::~String(void)               // 3分
{
    delete [] m_data;                         
// 由于m_data是内部数据类型,也可以写成 delete m_data;
    }

    // String的普通构造函数             
    String::String(const char *str)      // 6分
{
    if(str==NULL)                          
    {
        m_data = new char[1];    // 若能加 NULL 判断则更好
        *m_data = ‘\0’;                      
    }                                           
    else
    {
        int length = strlen(str);           
        m_data = new char[length+1];  // 若能加 NULL 判断则更好      
        strcpy(m_data, str);                
    }
}    
// 拷贝构造函数
    String::String(const String &other)   // 3分
    {    
    int length = strlen(other.m_data);     
    m_data = new char[length+1];      // 若能加 NULL 判断则更好    
    strcpy(m_data, other.m_data);         
}
// 赋值函数
    String & String::operate =(const String &other)    // 13分
    {    
        // (1) 检查自赋值                     // 4分
        if(this == &other)
            return *this;
    
// (2) 释放原有的内存资源            // 3分
        delete [] m_data;
        
        // (3)分配新的内存资源,并复制内容 // 3分
    int length = strlen(other.m_data);    
    m_data = new char[length+1];         // 若能加 NULL 判断则更好
        strcpy(m_data, other.m_data);
        
        // (4)返回本对象的引用            // 3分
        return *this;
}    

对于赋值函数,应当用“引用传递”的方式返回String对象。如果用“值传递”的方式,虽然功能仍然正确,但由于return语句要把 *this拷贝到保存返回值的外部存储单元之中,增加了不必要的开销,降低了赋值函数的效率。例如:
String a,b,c;

a = b; // 如果用“值传递”,将产生一次 *this 拷贝
a = b = c; // 如果用“值传递”,将产生两次 *this 拷贝


String的相加函数operate + 的实现如下:

String operate+(const String &s1, const String &s2) 
{
String temp;
delete temp.data;    // temp.data是仅含‘\0’的字符串
temp.data = new char[strlen(s1.data) + strlen(s2.data) +1];
strcpy(temp.data, s1.data);
strcat(temp.data, s2.data);
return temp;
}

 

对于相加函数,应当用“值传递”的方式返回String对象。如果改用“引用传递”,那么函数返回值是一个指向局部对象temp的“引用”。由于temp在函数结束时被自动销毁,将导致返回的“引用”无效。例如:
c = a + b;
此时 a + b 并不返回期望值,c什么也得不到,流下了隐患。

类String的构造函数(包含一个拷贝构造函数)、析构函数和赋值函数

标签:

原文地址:http://www.cnblogs.com/XiHua/p/4539022.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!