赋值符号"/>
剑指offer笔记(3)c++中重载类的赋值符号
这是剑指offer第二版25页的题目:
按照上面的要求写出来的代码是这样的:
#include<iostream>
#include<cstring>class CMyString
{public:CMyString(char* pData = nullptr){m_pData = pData;}CMyString(const CMyString& str){m_pData = new char(strlen(str.m_pData) + 1);strcpy(m_pData, str.m_pData);}~CMyString(){delete m_pData;}void Print(){std::cout << m_pData << std::endl;}CMyString& operator= (const CMyString& str){if(this == &str){return *this;}delete m_pData;m_pData = new char(strlen(str.m_pData) + 1);strcpy(m_pData, str.m_pData);return *this;}int main()
{char s[] = "hello";CMyString mystring1(s);CMyString mystring2;mystring2 = mystring1;mystring2.Print();return 0;
}
但是优秀的程序员是这样的:
#include<iostream>
#include<cstring>class CMyString
{public:CMyString(char* pData = nullptr){m_pData = pData;}CMyString(const CMyString& str){m_pData = new char(strlen(str.m_pData) + 1);strcpy(m_pData, str.m_pData);}~CMyString(){delete m_pData;}void Print(){std::cout << m_pData << std::endl;}CMyString& operator= (const CMyString& str){if(this != &str){CMyString strTemp(str);char* pTemp = m_pData;m_pData = strTemp.m_pData;strTemp.m_pData = pTemp;}return *this;}private:char* m_pData;};int main()
{char s[] = "hello";CMyString mystring1(s);CMyString mystring2;mystring2 = mystring1;mystring2.Print();return 0;
}
总结:
对比两个代码,我们会发现其实两段代码都执行了new 和delete的操作,但是第二段将new 和delete的操作隐藏在了拷贝构造函数和析构函数中了,这样使得代码更加强健。
更多推荐
剑指offer笔记(3)c++中重载类的赋值符号
发布评论