首先讲一下为什么要写operator=函数.

这是一个不得不解决而又容易忽视的问题!

当我们写一个类的时候, 正常情况下不需要为该类重载=运算符, 因为系统为每个类提供了默认的赋值运算符, 该操作会
把这个类的所有数据成员都进行一次=的操作进行赋值, 如果有以下类
class Point
{
 public:
  
  flaot x;
  float y;
  float z;
};
那么对这个类的对象进行的任何赋值操作都是正常的.
比如Point a;
a.x = 0;
a.y = 0;
a.z = 0;
Point b = a;
那么b中的所有值和a一样, 正常.

这时我们应该庆幸, 系统为我们提供了一个免费的=运算符, 省去了不少麻烦.

但是如果有以下代码,  问题就会出来.
class AwfulObject
{
 public:

AwfulObject(){pArry = new int[10];}
  virtual ~AwfulObject(){delete []pArry;}

private:

int* pArry;
};
这时我们再进行
AwfulObject a;
AwfulObject b = a;
这样的操作就会出错. 当进行析构的时候,两个指针重复delete了一块内存, 所以我们必须写自己的operator=.

接着讲一下如何写operator=函数.
1.解决上述产生的问题
知道了问题的原因所在, 就知道怎么下手了, 下面是参考写法
class GoodObject
{
public:

GoodObject(){pArry = new int[10];}
 virtual ~GoodObject(){delete []pArry;}
 GoodObject(const GoodObject& rhs)
 {
    *this = rhs;
 }
 GoodObject& opreator=(const GoodObject& rhs)
 {
  if (this != &rhs)
  {
   if (pArry != NULL)
   {
      delete []pArry;
   }
   pArry = new int[10];
   for (int i=0; i<10; ++i)
   {
    pArry[i] = rhs.pArry[i];
   }
  }
  return *this;
 }

private:

int* pArry;
};

2.为什么opreator=要返回*this?
为了支持a=b=c这样的连锁调用
3.为什么不返回const GoodObject&?
为了和编译器(a=b)=c这样的操作兼容
4.为什么要传入const GoodObject& rhs
主要支持一下操作:
GoodObject a;
const GoodObject b;
a = b;
5.为什么要有if (this != &rhs)这样的判断
主要是避免自我赋值a=a这样的情况发生.
6.不要忘记重写拷贝构造函数

以上代码未经调试, 出错的地方或有不好的地方请大侠指教~_~.
参考资料:Effective C++ 条款15, 16, 17

转载或修改请说明出处
链接:http://blog.csdn.net/howlet2/archive/2009/12/28/5090756.aspx
作者:howlet
E-Mial: howlet3@126.com

operator=函数.相关推荐

  1. C++学习笔记-----operator=函数处理自赋值

    很多时候我们需要对类使用赋值运算符operator=函数来将一个类赋值给令一个类,但是如果类的成员变量中存在指针类型的变量,而且这个指针的内存是从heap内存中申请的时候,在实现赋值运算符函数的时候要 ...

  2. C++中对象初始化赋值是否需要调用operator=函数

    一般对于初始化类变量有两种方式: A a; A b = a; 另一种方式是: A a ; A b; a =b; 对于第一种方式,编译器相当于在b的初始化的时候,用a的引用作为复制构造函数的参数进行操作 ...

  3. C++编程进阶3(如何写出正确的operator=、operator运算符的返回值以及是否应该是成员函数的讨论)

    八.如何写出一个安全的operator= 首先,operator=的返回值通常是一个类的引用,这一点需要和C++标准库的容器类的operator=保持一致 其次,如果一个类中含有指针成员,那么要防止自 ...

  4. python之operator操作符函数

    operator函数主要分为以下几类:对象比较.逻辑比较.算术运算和序列操作. 举例: #python 3.4 >>> operator.eq(1,2) False >> ...

  5. 一文说尽C++赋值运算符重载函数(operator=)

    http://www.cnblogs.com/zpcdbky/p/5027481.html 在前面: 关于C++的赋值运算符重载函数(operator=),网络以及各种教材上都有很多介绍,但可惜的是, ...

  6. C++:函数指针进阶(四):函数对象operator()

    C++中的  operator() 有两大主要作用: 1:Overloading --------重载() 操作符 2: Casting------实现对象类型转化 1:Overloading重载() ...

  7. 自动分析源代码,创建函数地图展示调用关系

    极客讨论器现在可以自动分析 C/C++/Java/C#/Python/Objective-C 语言源代码并生成表示调用关系的函数地图,并使用"旅游"模式,在函数地图中浏览代码.如图 ...

  8. C++——运算符的重载---以成员函数方式重载---以友元函数方式重载

    一.运算符的重载 1.运算符的重载 允许把标准运算符(如+ - * /等运算符)应用于自定义数据类型的对象,可以提高程序的可读性,运算符的重载本质上还是函数重载.运算符仅仅是语法上的方便,它是另一种函 ...

  9. 函数对象、 函数对象与容器、函数对象与算法

    一.函数对象 1.函数对象(function object)也称为仿函数(functor) 2.一个行为类似函数的对象,它可以没有参数,也可以带有若干参数. 3.任何重载了调用运算符operator( ...

最新文章

  1. Nature Methods | 用深度多任务神经网络探索单细胞数据
  2. UVA1629 Cake slicing
  3. Oracle 原理:序列
  4. jggrid标红列和动态标红行的几种方法
  5. jQuery Mobile中列表项ol、ul中的li的data-*选项
  6. Ubuntu14.04(LTS)gitHub客户端安装
  7. 毕设项目 - 基于SSM的教师工作考核绩效管理系统(含源码+论文)
  8. Python爬取 201865 条《隐秘的角落》弹幕,发现看剧不如爬山?
  9. latex模板中生成PDF出错
  10. 服务器私有信息,私有服务器
  11. [转]什么?你还不会写JQuery 插件
  12. 8月1日任务 11.14-11.17
  13. 购房置业者必上的10大房产网站
  14. 自己动手写服务器-1
  15. 助力 AI 银行发展 网易智企打造一站式金融服务
  16. 国内商务邮箱哪个好用?电子邮箱怎么申请?
  17. 百亿互刷宝php 站长,百度排名百亿互刷宝
  18. 数字示波器FFT分析
  19. Soul网关-day17
  20. 2w多字总结的VUE学习文档

热门文章

  1. 入职外包一个月,我离职了
  2. DEEP LEARNING 500 QUESTIONS PDF
  3. 程序员3~5年后如何规划自己
  4. linux实验三:基于mykernel 2.0编写一个简单的操作系统内核
  5. Qt:QDialog 界面美化
  6. QQ第三方登陆及同步内容到腾讯微博,腾讯空间,朋友网
  7. CUMT数据库SQL实验
  8. 分治算法--棋盘覆盖
  9. 登高望远,一文解答 2023 年你最关心的前端热点问题
  10. 字节跳动:抖音、西瓜、火山区别