高质量程序设计指南c++/c语言(6)--拷贝构造函数和赋值函数

    如果不主动编写拷贝构造函数和赋值函数,编译器就会以按成员拷贝的方式自动生成相应的默认函数。倘若类中含有指针成员或引用成员,那么这两个默认的函数就可能隐含错误。

    假设String类有一个char *m_data的数据成员,a.m_data的内容为“hello”,b.m_data的内容也为“hello”,现在将a赋值给b,默认赋值函数的按成员拷贝意味着执行b.m_data = a.m_data。这会造成3个错误

(1)b.m_data原来持有的内存没有释放。

(2)b.m_data和a.m_data指向同一块内存,任何一方的改动会影响其他一方。

(3)在对象被析构时,m_data被delete了两次。

String a("hello");   

String b("hello");

String c=a;   //调用默认拷贝构造函数,风格不好,宜改写为String c(a);

c=b;           //赋值函数

示例:String的拷贝构造函数和赋值函数

Stirng::String(const String &other)
{
    m_data = new char[strlen(other.m_data)+1];
    strcpy(m_data, other.m_data);
}

String & String::operator=(const String &other)
{
    if(this != &other)    、// 有a=a的情况
    {
        char *temp = new char[strlen(other.m_data)+1];
        strcpy(temp, other.m_data);
        delete [] m_data;
        m_data = temp;
    }

    return *this;
}

 

posted on 2013-04-26 16:56  江在路上2  阅读(225)  评论(0编辑  收藏  举报