博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
{面试题1: 赋值运算符函数}
阅读量:4590 次
发布时间:2019-06-09

本文共 1881 字,大约阅读时间需要 6 分钟。

From 剑指Offer 何海涛 著

#include 
#include
class CMyString { public: CMyString(char *pData = NULL); CMyString(const CMyString &other); ~CMyString(void); public: CMyString& operator=(const CMyString &other); private: char *m_pData;#if defined(NDEBUG) friend bool isEqual(const CMyString &left, const CMyString &right);#endif };CMyString::CMyString(char *pData) { if(pData != NULL) { size_t len = strlen(pData); m_pData = new char[len+1]; strcpy(m_pData, pData); } else { m_pData = new char[1]; *m_pData = '\0'; }}CMyString::CMyString(const CMyString &str) { size_t len = strlen(str.m_pData); m_pData = new char[len+1]; strcpy(m_pData, str.m_pData);}CMyString::~CMyString() { delete[] m_pData; m_pData = NULL;}CMyString& CMyString::operator=(const CMyString &other) { if(this != &other) { CMyString tmp(other); // 借助临时实例, 实现动态内存的释放, 符合 异常安全性(Exception Safety) 原则 char *pData = tmp.m_pData; tmp.m_pData = m_pData; m_pData = pData; } return *this;}#ifdef NDEBUGbool isEqual(const CMyString &left, const CMyString &right) { if(left.m_pData != right.m_pData && !strcmp(left.m_pData, right.m_pData)) { return true; } return false;}#endif

测试集:

void test(const CMyString &left, const CMyString &right) {    #if defined(NDEBUG)    std::cout << std::boolalpha << isEqual(left, right) << std::endl;    #endif}int main(int argc,char *argv[]) {    char pData[] = "Just For Test!";    CMyString str1(pData);    str1 = str1;         // 是否支持自赋值        CMyString str2;    CMyString str3;    str3 = str2 = str1;  // 是否支持连续赋值        test(str1, str2);    test(str2, str3);        return 0;}

异常安全性 原则: 对实例操作过程的过程中, 即便发生了异常, 实例仍能保持有效状态。

转载于:https://www.cnblogs.com/long3216/p/4438450.html

你可能感兴趣的文章
51nod1256【exgcd求逆元】
查看>>
HTTP长连接和短连接
查看>>
django使用JWT保存用户登录信息
查看>>
XSL:转换从哪里开始?
查看>>
iconv vs mb_convert_encoding
查看>>
跨域Ajax的实现
查看>>
电子商务分类
查看>>
项目变更管理
查看>>
make报错make: *** [sapi/cli/php] Error 1
查看>>
关于Java中~的问题
查看>>
[C/C++语言标准] ISO C99/ ISO C11/ ISO C++11/ ISO C++14/ISO C++17 Downloads
查看>>
44.Linux君正X1000-添加st7789v显示
查看>>
AC日记——大小写字母互换 openjudge 1.7 14
查看>>
第二届长三角音视频技术交流会筹备中
查看>>
关于启动Tomcat乱码问题的解决
查看>>
ASC7 Problem G. Network Wars
查看>>
js刷新页面方法大全
查看>>
java html中文汉字 反转义
查看>>
(4)HTML 5提供的一些新的标签用法以及和HTML 4的区别
查看>>
微软MSDN论坛上海聚会
查看>>