2017-01-30 90 views
3

根据C++标准,something.operator=(somethingElse)something = somethingElse之间是否有差异?显式的operator = call和= operator是否有区别?

第一次出现在T& something的模板中,我想知道是否可以用更易读的第二个版本替换它。

+3

请注意内置类型没有'operator ='。如果你有'T.operator =(something)',那么'T'不能是内置类型。 – NathanOliver

回答

1

有微小的差别,因为a = b并不总是对对象a调用明确操作:

  • T a = b;。这不是一个任务,但初始化:它会调用拷贝(或移动)建设
  • a = b;当是一个内部对象(整数,指针,浮点数,...):在=运营商是内置一个。
  • 如果T是可复制的,即使在类上没有声明operator =,也允许分配,因为编译器使用默认的内置分配运算符。

但是,如果operator =方法存在并且由重载解析规则选择,则赋值运算符将调用它。

5

不,没有。一个明确的=运算符在声明合适的operator=方法的类上调用operator=(),就像直接调用operator=方法一样。

这对所有运营商而言都是如此,而不仅仅是=。这就是类方法意义的定义:它指定将相应的运算符应用于类的实例时执行的操作。

+0

我正要对此+1,直到我读到“对所有操作员而言,这不仅仅是=”。其他运算符允许非成员,所以'a @ b'不能再和'a.operator @ ...'相同。一个可以使一个程序不合格,而另一个不可以,反之亦然。 –

4

除了在复制初始化上下文之外,短运算符表达式等同于函数表达式。 Table 12 C++标准草案的描述操作的表达式:

转载:

Subclause  Expression  As member function   As non-member function 

[over.unary] |  @a |  (a)[email protected] ( )  | [email protected](a) 
[over.binary] |  [email protected] |  (a)[email protected] (b)  | [email protected](a, b) 
[over.ass] |  a=b |  (a).operator= (b)  | 
[over.sub] |  a[b] |  (a).operator[](b)  | 
[over.ref] |  a-> |  (a).operator->( )  | 
[over.inc] |  [email protected] |  (a)[email protected] (0)  | [email protected](a, 0) 

哪里@是用于操作者的占位符。


原因,还有其它上下文使用=操作者;在函数声明,如拖欠成员函数,删除功能和= 0; // pure virtual

+0

@向下选民,关心评论? – WhiZTiM

相关问题