赋值运算符函数__from <剑指Offer>
前段时间忙于项目,难得偷得几日闲,为即将到来的就业季做准备。在面试时,应聘者要注意多和考官交流,只有具备良好的沟通能力,才能充分了解面试官的需求,从而有针对性地选择算法解决问题。
题目来源于《剑指Offer》,自己在原有基础上稍作批注和修改。
问题:为类型添加赋值运算符函数,可以把CMyString实例赋值给另一个实例、自身和连续赋值。
学习点:考虑问题充分,自己不会把赋值情况、内存泄漏考虑到这么细致。
#include<cstring> #include<cstdio> class CMyString { public: CMyString(char * pData = nullptr); CMyString(const CMyString& str); ~CMyString(void); CMyString& operator=(const CMyString& str); void Print(); private: char* m_pData; //类比C风格字符串 }; CMyString::CMyString(char * pData) { if (pData==nullptr) //空指针 { //创建空字符串 m_pData = new char[1]; m_pData[0] = '\0'; } else { int length = strlen(pData); m_pData = new char[length + 1]; //复制 /* char * strcpy(char * destination, const char * source); Copies the C string pointed by source into the array pointed by destination, including the terminating null character(and stopping at that point). */ strcpy(m_pData, pData); } } CMyString::CMyString(const CMyString& str) { int length = strlen(str.m_pData); //Returns the length of the C string str. The length of a C string is determined by the terminating null - character m_pData = new char[length + 1]; //new分配内存后,默认使用delete释放对象 strcpy(m_pData, str.m_pData); } CMyString::~CMyString(void) { delete[] m_pData; } //1. 返回值的类型声明为该类型的引用,程序结束前返回实例自身的引用(*this) //2. 传入的参数的类型声明为常量引用 //3. 释放实例自身的内存 //4. 判断传入的参数和当前的实例是不是同一个实例 //5. 升级:考虑异常安全性的解法 先new再delete CMyString& CMyString::operator=(const CMyString& str) //参考2 { if (this != &str) //参考4 { CMyString strTemp(str); //临时实例 //参考3 char* pTemp = strTemp.m_pData; strTemp.m_pData= m_pData; m_pData = pTemp; }//调用strTemp的析构函数,释放其内存 //参考1 return *this; } //================= 测试代码 ================== void CMyString::Print() { printf("%s", m_pData); } void Test1() { printf("Test1 begins:\n"); char* text = "Hello world"; CMyString str1(text); CMyString str2; str2 = str1; printf("The expected result is: %s.\n", text); printf("The actual result is: "); str2.Print(); printf(".\n"); } // 赋值给自己 void Test2() { printf("Test2 begins:\n"); char* text = "Hello world"; CMyString str1(text); str1 = str1; printf("The expected result is: %s.\n", text); printf("The actual result is: "); str1.Print(); printf(".\n"); } // 连续赋值 void Test3() { printf("Test3 begins:\n"); char* text = "Hello world"; CMyString str1(text); CMyString str2, str3; str3 = str2 = str1; printf("The expected result is: %s.\n", text); printf("The actual result is: "); str2.Print(); printf(".\n"); printf("The expected result is: %s.\n", text); printf("The actual result is: "); str3.Print(); printf(".\n"); } int main(int argc, char* argv[]) { Test1(); Test2(); Test3(); getchar(); //等待输入 return 0; }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步