2017-01-30 65 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