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. 小入门 Django(做个疫情数据报告)

    Django 是 Python web框架,发音 [ˈdʒæŋɡo] ,翻译成中文叫"姜狗". 为什么要学框架?其实我们自己完全可以用 Python 代码从0到1写一个web网站, ...

  2. 2021CISCN 华南赛区WEB wp

    CISCN 华南区域赛 太菜了 我躺平了 easy_seri <?php error_reporting(0); highlight_file(__FILE__); class Test{ pu ...

  3. 个人网站迁移之旅:从博客到知识库,从 Hexo 到 Docusaurus

    或是出于跟风,或是为了简历能好看点,2020 年 2 月,在翻看了中文互联网大量的「免费个人网页搭建教程」后,我选择了 Hexo + Github Pages 的方案,找了一款看上去还不错的主题,搭建 ...

  4. c++学习笔记(十)

    返回应用类型 返回引用 1.不要返回局部变量的引用 为了验证为什么不能返回局部变量的引用,我按照所学的例题自己做了一点小测试. #include<iostream> using names ...

  5. 微信小程序(六)

    MINA 框架: 启动: 冷启动,热启动 加载: 生命周期 路由: 事件: 事件时视图层到逻辑层的通信方式 事件可以将用户的行为反馈到逻辑层进行处理 事件可以绑定在组件上,触发事件后就会执行逻辑层对应 ...

  6. [bzoj1044]木棍分割

    第一个问题可以用贪心+二分解决第二个问题用f[i][j]表示i次分割后分割到j且满足条件的方案数,$f[i][j]=\sum_{k<j且sum[j]-sum[k]<=ans}f[i-1][ ...

  7. 解决:ElasticsearchException[X-Pack is not supported and Machine Learning is not available for

    解决:在config/elasticsearch.yml添加一条配置: xpack.ml.enabled: false 能启动了就. 在docker安装出现这个问题,目前还没解决. 算了用win10得 ...

  8. oracle和mysql的拼接查询

    oracle的 SELECT * FROM sys_user a WHERE 1=1 AND a.company_id || a.login_name IN('3001rddb414') 196676 ...

  9. kibana解决Kibana server is not ready yet问题

    找到kbn的config中的xml配置 将es的ip改成真正的ip

  10. git使用小技巧

    1. 合并一个分支的某次提交到另一个分支上 例如 将dev的某次提交 asfdiwehfsalkdnva872383 合并到master # git checkout master # git che ...