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

本文探讨了在C++中不手动编写拷贝构造函数和赋值函数时可能出现的问题,特别是对于含有指针成员的类。通过具体例子说明了默认行为可能导致的资源泄露和数据不一致等问题,并给出了正确的实现方式。

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

    假设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;
}

 

转载于:https://www.cnblogs.com/zzj3/archive/2013/04/26/3045219.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值