面试题1:赋值运算符函数
要点:
1. 判断传入参数和this是否是同一个
2. operator的参数设为常量引用,否则从形参到实参会调用赋值构造函数
3. 释放自己已有内存
4. 返回值为引用,才可以允许连续赋值
赋值运算符重载返回本类引用,形参是const引用
5. 要用strcpy,vs13用strcpy_s(m_pData, strlen(str.m_pData) + 1, str.m_Pdata)
1 class CMyString 2 { 3 public: 4 CMyString(char* pData = NULL); 5 CMyString(const CMyString& str); 6 ~CMyString(void); 7 8 CMyString& operator = (const CMyString& str); 9 10 void Print(); 11 12 private: 13 char* m_pData; 14 }; 15 16 CMyString& CMyString::operator = (const CMyString& str) 17 { 18 if(this == &str) 19 return *this; 20 21 delete []m_pData; 22 m_pData = NULL; 23 24 m_pData = new char[strlen(str.m_pData) + 1]; 25 strcpy(m_pData, str.m_pData); 26 27 return *this; 28 }
完整代码:
1 // AssignmentOperator.cpp : Defines the entry point for the console application. 2 // 3 4 // 《剑指Offer——名企面试官精讲典型编程题》代码 5 // 著作权所有者:何海涛 6 7 #include "stdafx.h" 8 #include <string> 9 10 class CMyString 11 { 12 public: 13 CMyString(char* pData = NULL); 14 CMyString(const CMyString& str); 15 ~CMyString(void); 16 17 CMyString& operator = (const CMyString& str); 18 19 void Print(); 20 21 private: 22 char* m_pData; 23 }; 24 25 CMyString::CMyString(char *pData) 26 { 27 if(pData == NULL) 28 { 29 m_pData = new char[1]; 30 m_pData[0] = '\0'; 31 } 32 else 33 { 34 int length = strlen(pData); 35 m_pData = new char[length + 1]; 36 strcpy(m_pData, pData); 37 } 38 } 39 40 CMyString::CMyString(const CMyString &str) 41 { 42 int length = strlen(str.m_pData); 43 m_pData = new char[length + 1]; 44 strcpy(m_pData, str.m_pData); 45 } 46 47 CMyString::~CMyString() 48 { 49 delete[] m_pData; 50 } 51 52 CMyString& CMyString::operator = (const CMyString& str) 53 { 54 if(this == &str) 55 return *this; 56 57 delete []m_pData; 58 m_pData = NULL; 59 60 m_pData = new char[strlen(str.m_pData) + 1]; 61 strcpy(m_pData, str.m_pData); 62 63 return *this; 64 } 65 66 // ====================测试代码==================== 67 void CMyString::Print() 68 { 69 printf("%s", m_pData); 70 } 71 72 void Test1() 73 { 74 printf("Test1 begins:\n"); 75 76 char* text = "Hello world"; 77 78 CMyString str1(text); 79 CMyString str2; 80 str2 = str1; 81 82 printf("The expected result is: %s.\n", text); 83 84 printf("The actual result is: "); 85 str2.Print(); 86 printf(".\n"); 87 } 88 89 // 赋值给自己 90 void Test2() 91 { 92 printf("Test2 begins:\n"); 93 94 char* text = "Hello world"; 95 96 CMyString str1(text); 97 str1 = str1; 98 99 printf("The expected result is: %s.\n", text); 100 101 printf("The actual result is: "); 102 str1.Print(); 103 printf(".\n"); 104 } 105 106 // 连续赋值 107 void Test3() 108 { 109 printf("Test3 begins:\n"); 110 111 char* text = "Hello world"; 112 113 CMyString str1(text); 114 CMyString str2, str3; 115 str3 = str2 = str1; 116 117 printf("The expected result is: %s.\n", text); 118 119 printf("The actual result is: "); 120 str2.Print(); 121 printf(".\n"); 122 123 printf("The expected result is: %s.\n", text); 124 125 printf("The actual result is: "); 126 str3.Print(); 127 printf(".\n"); 128 } 129 130 int _tmain(int argc, _TCHAR* argv[]) 131 { 132 Test1(); 133 Test2(); 134 Test3(); 135 system("pause"); 136 137 return 0; 138 }
浙公网安备 33010602011771号