String类实现

String类的一个简单实现

class CMyString
{
    friend ostream &operator<<(ostream &o, const CMyString &str);
public:
    CMyString(const char *str);
    ~CMyString();
    CMyString(const CMyString &other);
    CMyString &operator=(const CMyString &str);
private:
    char *m_pData;
};

CMyString::CMyString(const char *str)
{
    if (!str){
        m_pData = new char[1];
        if (m_pData){
            m_pData[0] = '\0';
        }
    }
    m_pData = new char[strlen(str)+1];
    if (m_pData){
        strcpy(m_pData, str);
    }
}

CMyString::CMyString(const CMyString &other)
{
    m_pData = new char[strlen(other.m_pData)+1];
    if (m_pData){
        strcpy(m_pData, other.m_pData);
    }
}

CMyString::~CMyString()
{
    delete []m_pData;
    m_pData = NULL;
}

/*
应用RAII思想,tempStr在离开作用域后自动调用析构函数释放原字符串中m_pData部分。
*/
CMyString &CMyString::operator=(const CMyString &other)
{
    if (this == &other)
        return *this;
    CMyString tempStr(other);

    char *pTemp = tempStr.m_pData;
    tempStr.m_pData = m_pData;
    m_pData = pTemp;
    return *this;
}

ostream &operator<<(ostream &o, const CMyString &str)
{
    o << str.m_pData;
    return o;
}

要点:

  • 赋值运算符中需返回实例自身的引用,保证允许连续赋值。
  • 复制构造函数参数需声明为常量引用,否则调用时会导致栈溢出。
  • 赋值运算符中参数建议声明为常量引用,可以少调用一次复制构造函数。
  • 分配新的内存之前需释放自身已有的空间。
  • 赋值运算符中需要判断传入参数和实例是否是同一个实例(自赋值)。
  • 考虑异常安全性,new char时内存不足时m_pData是空指针,容易导致程序崩溃。建议应用RAII思想,如赋值运算符中将资源的分配控制转移到复制构造函数中进行。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值