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. 性能工具之代码级性能测试工具ContiPerf

    前言 做性能的同学一定遇到过这样的场景:应用级别的性能测试发现一个操作的响应时间很长,然后要花费很多时间去逐级排查,最后却发现罪魁祸首是代码中某个实现低效的底层算法.这种自上而下的逐级排查定位的方法, ...

  2. Pip安装Django超时(time out)解决方法

    (ll_env)learning_log$  pip install Django  执行该命令,始终报错,如上图 解决方法如下: pip install  -i http://pypi.douban ...

  3. js运算符 及 运算符优先级

    「运算符」是用于实现赋值.比较和执行算数运算等功能的符号.常用运算符分类如下符号 算数运算符 递增和递减运算符 比较运算符 逻辑运算符 赋值运算符 算数运算符 运算符 描述 案例 + 加 10+20= ...

  4. node 读取文件内容并响应

    node 读取文件内容并响应 const http = require('http'); const fs = require('fs') //创建 Server const server = htt ...

  5. 浏览器调用接口正常,jmeter调不通的可能原因

    首先,还是http状态码介绍(网上都能找到这些简介): 1xx 信息,服务器收到请求,需要请求者继续执行操作 2xx 成功,操作被成功接收并处理 3xx 重定向,需要进一步的操作以完成请求 4xx 客 ...

  6. Python 函数 参数传递

    参数传递    在 python 中,类型属于对象,变量是没有类型的:        a=[1,2,3]        a="Runoob"    以上代码中,[1,2,3] 是 ...

  7. 安装mysql会出现start service错误

    安装MySQL时无法启动服务(could not start the service MYSQL .Error:0)安装mysql会出现start service错误安装mysql时 配置到start ...

  8. 生产者消费者模型及Golang简单实现

    简介:介绍生产者消费者模型,及go简单实现的demo. 一.生产者消费者模型 生产者消费者模型:某个模块(函数等〉负责产生数据,这些数据由另一个模块来负责处理(此处的模块是广义的,可以是类.函数.协程 ...

  9. [cf1215F]Radio Stations

    这道题如果没有功率的限制,显然就是一个裸的2-sat 考虑将功率的限制也放在图上:如果选择了功率i,那么功率区间不包含它的点只能不选,连边即可 但是这样建图的边数是o(n^2),需要优化 将功率区间分 ...

  10. [bzoj1052]覆盖问题

    先二分答案,容易发现一定有一个正方形覆盖在角上(即有两条边在最X的地方),否则4个最X的点一定无法覆盖,然后暴力确定即可 1 #include<bits/stdc++.h> 2 using ...