/*******************************************************************
Copyright(c) 2016, Harry He
All rights reserved.
Distributed under the BSD license.
(See accompanying file LICENSE.txt at
https://github.com/zhedahht/CodingInterviewChinese2/blob/master/LICENSE.txt)
*******************************************************************///==================================================================// 《剑指Offer——名企面试官精讲典型编程题》代码// 作者:何海涛//==================================================================// 面试题1:赋值运算符函数// 题目:如下为类型CMyString的声明,请为该类型添加赋值运算符函数。#include<cstring>#include<cstdio>classCMyString{public:CMyString(char* pData =nullptr);CMyString(const CMyString& str);~CMyString(void);
CMyString&operator=(const CMyString& str);voidPrint();private:char* m_pData;};
CMyString::CMyString(char*pData){if(pData ==nullptr){
m_pData =newchar[1];
m_pData[0]='\0';}else{int length =strlen(pData);
m_pData =newchar[length +1];strcpy(m_pData, pData);}}
CMyString::CMyString(const CMyString &str){int length =strlen(str.m_pData);
m_pData =newchar[length +1];strcpy(m_pData, str.m_pData);}
CMyString::~CMyString(){delete[] m_pData;}//只有返回引用才可以连续赋值// 若传入的参数不是引用而是实例,那么从形参到实参还会调用一次拷贝构造函数
CMyString& CMyString::operator=(const CMyString& str){// 若事先不判断就进行赋值,那么在释放实例自身的内存时就会产生问题:当/*
*this和传入的参数是同一个实例时,那么一旦释放了自身的内存,传入的参数的内存也同时被释放了,因此再也找不到需要赋值的内容了
*/if(this==&str)return*this;// 要在分配新内存之前,需要释放自身已有的空间delete[]m_pData;
m_pData =nullptr;
m_pData =newchar[strlen(str.m_pData)+1];strcpy(m_pData, str.m_pData);return*this;}// ====================测试代码====================void CMyString::Print(){printf("%s", m_pData);}voidTest1(){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");}// 赋值给自己voidTest2(){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");}// 连续赋值voidTest3(){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");}intmain(int argc,char* argv[]){Test1();Test2();Test3();return0;}