重载赋值操作符

C++默认的赋值操作是按成员赋值,一些情况下(如含有指针成员时),这种操作往往会有问题。如:

 1 #include "stdafx.h"
 2 #include <string>
 3 
 4 using namespace std;
 5 
 6 class A
 7 {
 8 private:
 9     char *p;
10     size_t nSize;
11 public:A(const string &str);
12        ~A();
13 };
14 
15 A::A(const string &str)
16 {
17     nSize = str.size();
18     p = new char[nSize + 1];
19     strcpy_s(p,nSize+1,str.c_str());
20     p[nSize] = '\0';
21 }
22 
23 A::~A()
24 {
25     delete[] p;
26 }
27 
28 int _tmain(int argc, _TCHAR* argv[])
29 {
30     {
31         A obj1("hello");
32         A obj2("world");
33         obj2 = obj1;//赋值操作
34     }
35     system("pause");
36     return 0;
37 }

编译,运行会出错

原因是赋值操作后,obj1.p和obj2.p指向了同一块内存,如下所示。

析构时就对同一块内存释放了两次。

我们赋值的真正意思可能是,两个对象各有自己的一块内存,互不相干,只是复制其中的内容。这时候就需要重载赋值操作符了。

 1 #include "stdafx.h"
 2 #include <string>
 3 
 4 using namespace std;
 5 
 6 class A
 7 {
 8 private:
 9     char *p;
10     size_t nSize;
11 public:
12     A& operator=(const A &a);//重载赋值操作符
13 public:
14     A(const string &str);
15     ~A();
16 };
17 
18 A::A(const string &str)
19 {
20     nSize = str.size();
21     p = new char[nSize + 1];
22     strcpy_s(p,nSize+1,str.c_str());
23     p[nSize] = '\0';
24 }
25 
26 A::~A()
27 {
28     delete[] p;
29 }
30 
31 inline A& A::operator=(const A &a)
32 {
33     if (&a != this)//防止自赋值
34     {
35         delete[] p;
36         p = new char[a.nSize + 1]; 
37         strcpy_s(p,nSize+1,a.p);
38     }
39     return *this;
40 }
41 
42 int _tmain(int argc, _TCHAR* argv[])
43 {
44     {
45         A obj1("hello");
46         A obj2("world");
47         obj2 = obj1;//赋值操作
48     }
49     system("pause");
50     return 0;
51 }

运行结果

注:若不希望用户对该类对象进行赋值操作,则可以重载赋值操作符为private。

原文地址:https://www.cnblogs.com/dahai/p/2012519.html