C++ 惯用法之 Copy-Swap 拷贝交换
这是“C++ 惯用法”合集的第 3 篇,前面 2 篇分别介绍了 RAII 和 PIMPL 两种惯用法:
正式介绍 Copy-Swap 之前,先看下《剑指 Offer》里的第☝️题:
如下为类型 CMyString 的声明,请为该类型添加赋值运算符函数。
class CMyString { public: CMyString(char* pData = nullptr); CMyString(const CMyString& str); ~CMyString(); private: char* m_pData; };
这道题目虽然基础,但考察点颇多,有区分度:
- 返回值类型应为引用类型,否则将无法支持形如
s3 = s2 = s1的连续赋值 - 形参类型应为 const 引用类型
- 无资源泄露,正确释放赋值运算符左侧的对象的资源
- 自赋值安全,能够正确处理
s1 = s1的语句 - 考虑异常安全
解法 1
CMyString& operator=(const CMyString& str) { if(this == &str) return *this; delete[] m_pData; m_pData = nullptr; m_pData = new char[strlen(str.m_pData) + 1]; strcpy(m_pData, str.m_pData); return *this; }
上面代码有些细节需要注意:
- 删除数组使用
delete[]运算符 strlen计算长度不含字符串末尾的结束符