operator=函数.

来源:互联网 发布:软件即服务 编辑:程序博客网 时间:2024/05/23 01:20

首先讲一下为什么要写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