The answer is same as Copy Constructor. If a class doesn’t contain pointers, then there is no need to write assignment operator and copy constructor. The compiler creates a default copy constructor and assignment operators for every class.

  The compiler created copy constructor and assignment operator may not be sufficient when we have pointers or any run time allocation of resource like file handle, a network connection..etc. For example, consider the following program.

 1 #include<iostream>
2 using namespace std;
3
4 // A class without user defined assignment operator
5 class Test
6 {
7 int *ptr;
8 public:
9 Test (int i = 0)
10 {
11 ptr = new int(i);
12 }
13 void setValue (int i)
14 {
15 *ptr = i;
16 }
17 void print()
18 {
19 cout << *ptr << endl;
20 }
21 };
22
23 int main()
24 {
25 Test t1(5);
26 Test t2;
27 t2 = t1;
28 t1.setValue(10);
29 t2.print();
30 return 0;
31 }

  Output of above program is “10″.

  If we take a look at main(), we modified ‘t1′ using setValue() function, but the changes are also reflected in object ‘t2′. This type of unexpected changes cause problems.
  Since there is no user defined assignment operator in the above program, compiler creates a default assignment operator, which copies ‘ptr’ of right hand side to left hand side. So both ‘ptr’s start pointing to the same location.

  We can handle the above problem in two ways.

  1) Do not allow assignment of one object to other object. We can create our own dummy assignment operator and make it private.

  2) Write your own assignment operator that does deep copy.

  

  Same is true for Copy Constructor.

  Following is an example of overloading assignment operator for the above class.

 1 #include<iostream>
2 using namespace std;
3
4 class Test
5 {
6 int *ptr;
7 public:
8 Test (int i = 0)
9 {
10 ptr = new int(i);
11 }
12 void setValue (int i)
13 {
14 *ptr = i;
15 }
16 void print()
17 {
18 cout << *ptr << endl;
19 }
20 Test & operator = (const Test &t);
21 };
22
23 Test & Test::operator = (const Test &t)
24 {
25 // Check for self assignment
26 if(this != &t)
27 {
28 *ptr = *(t.ptr);
29 }
30
31 return *this;
32 }
33
34 int main()
35 {
36 Test t1(5);
37 Test t2;
38 t2 = t1;
39 t1.setValue(10);
40 t2.print();
41 return 0;
42 }

  Output:5
  

  We should also add a copy constructor to the above class, so that the statements like “Test t3 = t4;” also don’t cause any problem.

  Note the if condition in assignment operator. While overloading assignment operator, we must check for self assignment(认同测试). Otherwise assigning an object to itself may lead to unexpected results (See this). Self assignment check is not necessary for the above ‘Test’ class, because ‘ptr’ always points to one integer and we may reuse the same memory.

  But in general, it is a recommended practice to do self-assignment check.

  补充:

  C++ doesn't allow default assignment operator to be used when there is a reference in your class.

  For example, the following program produces error "error C2582: 'Test' : 'operator =' function is unavailable".

 1 #include<iostream>
2 using namespace std;
3
4
5 class Test
6 {
7 int x;
8 int &ref;
9 public:
10 Test (int i):x(i),ref(x)
11 {
12 }
13 void print()
14 {
15 cout << ref;
16 }
17 void setX(int i)
18 {
19 x = i;
20 }
21 //Test &operator = (const Test &t) {x = t.x;}
22 };
23
24
25 int main()
26 {
27 Test t1(10);
28 Test t2(20);
29 t2 = t1;
30 t1.setX(40);
31 t2.print();
32 return 0;
33 }

  If you uncomment the operator definition in the above program, the program works fine and prints "10".
  So compiler forces to write an assignment operator when you have a non-static reference in your class.

  Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.

  转载请注明:http://www.cnblogs.com/iloveyouforever/

  2013-11-26  21:35:48

When should we write our own assignment operator in C++?的更多相关文章

  1. Lintcode208 Assignment Operator Overloading (C++ Only) solution 题解

    [题目描述] Implement an assignment operator overloading method. Make sure that: The new data can be copi ...

  2. Effective C++ 第0章 copy constructor和copy assignment operator

    拷贝构造函数(copy constructor)被用来以一个对象来初始化同类型的另一个对象,拷贝赋值运算符(copy assignment operator)被用来将一个对象中的值拷贝到同类型的另一个 ...

  3. copy constructor和copy assignment operator的区别

    拷贝构造函数(copy constructor)被用来以一个对象来初始化同类型的另一个对象,拷贝赋值运算符(copy assignment operator)被用来将一个对象中的值拷贝到同类型的另一个 ...

  4. Default Assignment Operator and References

    We have discussed assignment operator overloading for dynamically allocated resources here . This is ...

  5. Copy constructor vs assignment operator in C++

    Difficulty Level: Rookie Consider the following C++ program. 1 #include<iostream> 2 #include&l ...

  6. How to use base class's assignment operator in C++

    看了android下的代码,好长时间没看了,有个关于C++的知识点不是很清楚,查了下: 如何使用基类中的赋值运算符? 引述自http://stackoverflow.com/questions/122 ...

  7. PythonStudy——赋值运算符 Assignment operator

    eg: num = 10 num += 1 # 等价于 num = num + 1 => 11 print(num) 特殊操作: 1.链式赋值 a = b = num print(a, b, n ...

  8. c++, 派生类的构造函数和析构函数 , [ 以及operator=不能被继承 or Not的探讨]

    说明:文章中关于operator=实现的示例,从语法上是对的,但逻辑和习惯上都是错误的. 参见另一篇专门探究operator=的文章:<c++,operator=>http://www.c ...

  9. C++ operator overload -- 操作符重载

    C++ operator overload -- 操作符重载 2011-12-13 14:18:29 分类: C/C++ 操作符重载有两种方式,一是以成员函数方式重载,另一种是全局函数. 先看例子 # ...

随机推荐

  1. 阿里云ECI如何6秒扩容3000容器实例?

    引言 根据最新CNCF报告,有超过90%的用户在生产环境使用容器,并且有超过80%的用户通过Kubernetes管理容器.是不是我们的生产环境上了K8s就完美解决了应用部署的问题?IT界有句俗语,没有 ...

  2. Jenkins+SVN+Maven+testNG管理项目

    1.登录访问:http://localhost:8080/jenkins 2.系统管理 => 全局工具配置 => ADD JDK  AND  Add Maven 3.安装SVN插件:系统管 ...

  3. Sonar规范扫描Java代码暴露的问题

    字符串和封装类型应使用 equals()进行比较 例如java.lang.Integer使用引用等于==或!=,因为它不是比较实际值,而是比较内存中的位置. String firstName = ge ...

  4. PTA 树的同构 (25分)

    PTA 树的同构 (25分) 输入格式: 输入给出2棵二叉树树的信息.对于每棵树,首先在一行中给出一个非负整数N (≤10),即该树的结点数(此时假设结点从0到N−1编号):随后N行,第i行对应编号第 ...

  5. 12组-Alpha冲刺-2/6

    一.基本情况 队名:字节不跳动 组长博客:https://www.cnblogs.com/147258369k/p/15535639.html 小组人数:10人 二.冲刺概况汇报 侯钦凯 过去两天完成 ...

  6. windows 上搭建 sftp 服务器 -freesshd全过程( 在linux上部署逐浪CMS的必读教程)

    文章标题: windows 上搭建 sftp 服务器 - freesshd全过程 关键字 : freesshd 文章分类: 教程 创建时间: 2020年3月23日 缘由 动手 第一步:添加用户 第二步 ...

  7. python及pygame雷霆战机游戏项目实战01 控制飞机

    入门 在这个系列中,将制作一个雷霆战机游戏. 首先,将游戏设置修改一下: WIDTH = 480 HEIGHT = 600 FPS = 60 玩家精灵 要添加的第一件事是代表玩家的精灵.最终,这将是一 ...

  8. [hdu7013]String Mod

    枚举$a$​​​和$b$​​​​​出现的次数,问题即求$$A_{i,j}=\sum_{p=0}^{L}\sum_{q=0}^{L-p}[n\mid (p-i)][n\mid (q-j)]{L\choo ...

  9. [loj519]数学上来先打表

    建立操作树,即1和3操作时i-1向i连边,2操作中k向i连边,然后dfs一遍 那么当我们走到一个节点,就执行该操作(修改也是操作),退出后取消该操作即可 于是相当于要维护一个东西,支持:1.加边:2. ...

  10. Java设计模式之(十一)——享元模式

    1.什么是享元模式? Use sharing to support large numbers of fine-grained objects efficiently. 享元模式(Flyweight ...