面试题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] = '';
 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:
");
 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.
", text);
 83 
 84     printf("The actual result is: ");
 85     str2.Print();
 86     printf(".
");
 87 }
 88 
 89 // 赋值给自己
 90 void Test2()
 91 {
 92     printf("Test2 begins:
");
 93 
 94     char* text = "Hello world";
 95 
 96     CMyString str1(text);
 97     str1 = str1;
 98 
 99     printf("The expected result is: %s.
", text);
100 
101     printf("The actual result is: ");
102     str1.Print();
103     printf(".
");
104 }
105 
106 // 连续赋值
107 void Test3()
108 {
109     printf("Test3 begins:
");
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.
", text);
118 
119     printf("The actual result is: ");
120     str2.Print();
121     printf(".
");
122 
123     printf("The expected result is: %s.
", text);
124 
125     printf("The actual result is: ");
126     str3.Print();
127     printf(".
");
128 }
129 
130 int _tmain(int argc, _TCHAR* argv[])
131 {
132     Test1();
133     Test2();
134     Test3();
135     system("pause");
136 
137     return 0;
138 }
View Code
原文地址:https://www.cnblogs.com/raichen/p/5626900.html