题目:如下为类型CMyString的声明,请为该类型添加赋值运算符函数。
class CMyString { public: CMyString(char* pData = nullptr); CMyString(const CMyString& str); ~CMyString(void); void Print(); private: char* m_pData; };
针对本题,有几个点需要关注:
(1)返回值类型要声明为类型的引用,这样才能够进行连续赋值。当声明为void时,如str2=str1=str,当完成str1=str后,没有返回值,str1不能再对str2赋值;
(2)把参数声明为引用,能够避免重复调用复制构造函数,提高效率;同时把参数声明为常量,能够避免赋值函数内对参数误操作;
(3)申请内存前要释放已有的内存,否则会造成内存泄漏;
(4)首先要判断是不是对象本身,不能对自己进行赋值操作。
测试代码如下:
#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; }; 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]; strcpy(m_pData, pData); } } CMyString::CMyString(const CMyString &str) { int length = strlen(str.m_pData); m_pData = new char[length + 1]; strcpy(m_pData, str.m_pData); } CMyString::~CMyString() { delete[] m_pData; } CMyString& 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; } // ====================测试代码==================== 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(); return 0; }
总结:
(1)本题的主要考察点为运算符重载和赋值函数传参问题;
(2)在申请内存前需要关注已有内存的释放问题,注意内存泄漏。