为什么要在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;
}

时间: 2024-10-31 17:54:52

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

为什么operator=操作符返回引用

问题: MSDN文档中解释到:operator=操作符缺省情况下返回引用-- TYPE& TYPE::operator=(const TYPE&) 为什么呢?我对此的理解是:"="是个二进制操作符.其传入的参数是引用对象,而其它的参数是类实例,"="在这个类实例中被重载.而我在实际应用中可以不用返回任何类型(void)来实现赋值操作符,并仍然可以完成赋值操作.我这样做正确吗?如果不正确,那么为什么缺省的实现返回引用呢? 解答: 如果你再花点时间想一想

《C++面向对象高效编程(第2版)》——3.16 从函数中返回引用

3.16 从函数中返回引用 C++面向对象高效编程(第2版)要尽可能避免从函数返回引用.原因如下: (1)能从函数安全返回对某对象的引用(假定为foo)时,该函数不能创建对象foo.否则,谁对新创建对象的存储区负责?因为它不能是局部对象,这意味着在调用foo()之前, 左值(L-value)语义的含义 左值可用在赋值操作符的左则(LHS).例如,a = b表示a将被修改,而且它是一个左值.许多C++(和C)的操作符都要求正确地操作左值.所有其他操作符与赋值号结合的操作符,例如,+=./=等都是左

arcgis-ae+c#中返回距离函数报错

问题描述 ae+c#中返回距离函数报错 IFeatureLayer aFL = axMapControl1.Map.get_Layer(0) as IFeatureLayer; IFeatureLayer bFL = axMapControl1.Map.get_Layer(1) as IFeatureLayer; IFeatureClass aFClass = aFL.FeatureClass; IFeatureCursor aFC = aFClass.Search(null, true); I

Java异常处理--尽量不要从try区段中返回(return)

异常处理 Java异常处理模型与其他语言相比,关键词finally是最出色的新增特性了.finally构件使得该区段中的代码总是得以执行,而无论是否发生异常,特别适用于维护对象的内部状态(用来保证异常发生恢复对象的有效状态,以确保程序能在处理完异常后自动再次投入运行)和清理non-memory资源(垃圾回收机制无法处理的资源,如数据库连接.Socket等等).         但有一点值得注意,那就是尽量不要从try区段中返回(调用return),因为只要有finally区段存在,它就一定会被执

从Microsoft Sql Server 2005中返回有一定顺序的记录集

摘要:应用SqlServer2005开发也已经有一段时间了,但是很多时候都是把SqlServer2005当做SqlServer2000来用,因此很多SqlServer2005的新特性我都没有用到,有一个原因就是要兼容SqlServer2000的用户.新特性出来的当然就要用于实际当中,要想知道SQLServer2005的新特性可以参看微软网站的What's New in SQL Server 2005? ,特性有很多本篇文章主要介绍的是在数据库中返回特定顺序的记录集. 数据库模型: 在我们深入Sq

SQL Server 7.0 入门(八)---存储过程中返回结果

server|存储过程 存储过程中返回结果 从存储过程中返回结果有三种方式: 1. 返回结果集 这是客户端应用程序返回结果的最通用的方法.结果集是通过使用SELECT语句选择数据产生的.结果集可以从永久表.临时表或局部变量中产生.将结果返回到另一个存储过程不是一种有效的方法.存储过程不能访问另一个存储过程建立的结果集. 例如从永久表中返回结果集: USE pubs GO CREATE PROCEDURE ap_CreateResultFromPermtable AS SELECT au_inam

在C#中如何在函数参数中返回结构数组?

函数|数组 头晕脑涨地研究了一天,就为了实现在函数的参数中返回结构数组. 现供大家分享,节省学习时间. 实例:  /// <summary>  /// 用户信息结构  /// </summary>  public struct TUSER  {   public string LoginName;   public string LoginPass;   public string TrueName;   public string EMail;   public int Leve

修改MOSS搜索结果链接及搜索结果中返回的结果属性

当我们配置好MOSS搜索好,但它默认的搜索链接是该文档本身的连接,而非我们想要的链接,有时候我们想要的是它的别一个栏来当链接, 有时候我们也想显示别的栏给用户看,可以通过修改搜索结果中返回的属性来达到目的. 1.首先要了解MOSS搜索返回的是什么 MOSS搜索结果返回的是XML数据集, 那它返回的XML数据格式是怎样的哪,如下: 代码 <All_Results> <Result> <id>1</id> <workid>56859</work

在JS方法中返回多个值的方法汇总

  本文给大家汇总了在javascript方法中返回多个值的方法,都是在个人项目中检验过的,这里推荐给大家,有需要的小伙伴可以参考下. 在使用JS编程中,有时需要在一个方法返回两个个或两个以上的数据,用下面的几种方法都可以实现: 1 使用数组的方式,如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 <html> <head> <title>JS函数返回多个值</title> <