为什么要在operator=中返回"*this"的引用

豆豆网   技术应用频道   2007年03月16日  【字号: 收藏本文

本文详细介绍为什么要在operator=中返回"*this"的引用

  本文示例源代码或素材下载

  [问题的提出]:

  在很多书籍和文章中,很多次提到在对赋值操作符(=)进行重载的时候,要返回对目的(调用)对象实例(*this)的引用。其中不免有这样的论断:一定要返回对调用对象的引用;返回对调用实例对象的引用是为了实现链式连续赋值。

  这里说明两个问题:第一,是否重载赋值操作符必须返回对调用对象的引用,第二,是否这样就可以实现链式赋值,而不这样就不行。

  首先,必须承认,返回对"*this"的引用是标准的二目操作符重载的格式,效率很高。这样做有很多优点:如实现链式赋值、避免临时对象的产生(调用拷贝构造函数)、销毁(调用析构函数),但不是非这样做不可,下面通过对比来论述返回对"*this"的引用的优点及其他做法的缺点,同时也能清楚第二个问题,我们从例子着手。// a.h
class A 
{
public:
A();
  A(int nTest);
  A(const A& a);
  virtual ~A();
  A operator=(const A& a);
  // A& operator=(const A& a);
private:
  int m_nTest;
  
public:
  void printit();
};

// a.cpp
A::A(int nTest)
{
  m_nTest = nTest;
  cout << "constructor A Value is executed now!" << endl;
}
A::A(const A& a)
{
  this->m_nTest = a.m_nTest;
  cout << "Copy constructor A is executed now!" << endl;  
}
A::A()
{
  cout << "constructor A Default is executed now!" << endl;
}
A::~A()
{
  cout << "Destructor A is executed now!" << endl;
}
A A::operator=(const A& a)
// A& A::operator=(const A& a)
{
  if (this==&a) 
  return *this;
  this->m_nTest = a.m_nTest;
  cout << "Assignment A is 
executed now!" << endl;
  return *this;
}
在main()函数中调用A a(100),b(99),c(98);
a = b = c;
a.printit();
b.printit();
c.printit();
结果为:

作者:康建东    责编:豆豆技术应用

正在加载评论...