首页 > 编程语言 > 详细

C++赋值运算符

时间:2019-03-31 16:04:44      阅读:140      评论:0      收藏:0      [点我收藏+]
技术分享图片
 1 #include <cstring>
 2 #include <cstdio>
 3 using namespace std;
 4 
 5 class CMyString
 6 {
 7 public:
 8     CMyString(char* pData=nullptr);
 9     CMyString(const CMyString& str);
10     CMyString& operator=(const CMyString& str);
11     ~CMyString();
12 
13     void Print();
14 private:
15     char* m_pData;
16 };
17 
18 CMyString::CMyString(char *pData)
19 {
20     if (pData == nullptr)
21     {
22         m_pData = new char[1];
23         m_pData[0] = \0;
24     }
25     else
26     {
27         int length = strlen(pData);
28         m_pData = new char[length + 1];
29         strcpy_s(m_pData, length + 1, pData);
30     }
31 }
32 CMyString::CMyString(const CMyString& str)
33 {
34     int length = strlen(str.m_pData);
35     m_pData = new char[length+1];
36     strcpy_s(m_pData, length + 1, str.m_pData);
37 }
38 CMyString::~CMyString()
39 {
40     delete[] m_pData;
41 }
42 CMyString& CMyString::operator=(const CMyString& str)
43 {
44     if (this == &str) return *this;
45     CMyString strTemp(str);
46     char* pTemp = strTemp.m_pData;
47     strTemp.m_pData = m_pData;
48     m_pData = pTemp;
49     return *this;
50 }
51 void CMyString::Print()
52 {
53     printf("%s", m_pData);
54 }
View Code

定义一个赋值运算符时需要考虑的要点:

  1. 把返回值声明为该类型的引用,并在函数结束时前返回实例自身的引用。这样才可以允许连续赋值。
  2. 传入的参数需要声明为常量引用,如果传入的参数不是引用而是实例,则从形参到实参会调用一次复制构造函数。
  3. 释放实例自身已有的内存,如果在分配新内存前忘记释放自己已有的内存,则会出现内存泄漏。
  4. 判断传入参数与当前实例是不是同一个实例,如果是同一个,则立即返回。如果事先不判断会导致严重的问题,一旦释放了自身的内存,传入的参数的内存也同时被释放了,因此再也找不到需要赋值的内容了。
  5. 考虑异常情况,如果使用new时抛出异常,则m_pData指向的内存已被释放,则m_pData将是一个空指针,很容易导致程序崩溃。

C++赋值运算符

原文:https://www.cnblogs.com/larry-xia/p/10631698.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!