簡體   English   中英

賦值運算符並不總是被調用

[英]assignment operator not always called

我有一個帶有兩個函數的模板類,摘錄如下所示;

template<class TYPE, class ARG_TYPE>
int MyClassT<TYPE, ARG_TYPE>::Add(ARG_TYPE newElement)
{ 
    TYPE Element = newElement; <--- TYPE operator= not called, shallow copy
'
'
}

template<class TYPE, class ARG_TYPE>
void MyClassT<TYPE, ARG_TYPE>::SetAt(int nIndex, ARG_TYPE newElement)
{ 
,
,
m_pData[nIndex] = newElement;  <--- TYPE operator= is called, deep copy

'
'
}

為什么第一種情況導致淺表副本,而第二種情況導致深表副本? 我假設在第一種情況下將替換副本構造函數,但不知道為什么。

TYPE Element = newElement; <--- TYPE operator= not called, shallow copy

這應該調用copy-constructor,而不是operator=() ,因為這不是賦值語句。 這是初始化。

  • 初始化調用復制構造函數。 在初始化時,將構造一個新對象。
  • 賦值調用operator=() 在分配中,舊對象將更新為給定值。

因此,您是否為TYPE定義了一個復制構造函數?

我假設在第一種情況下將替換副本構造函數,但不知道為什么。

那正是正在發生的事情。 C ++標准規定了這種行為。 您應該使復制構造函數執行與賦值運算符相同的操作。

TYPE Element = newElement;

這實際上是結構,而不是復制運算符語法。 這樣,它將調用復制構造函數。

TYPE Element;
Element = newElement;

將在構造對象上調用=時按您期望的方式調用賦值運算符-同樣,將構造數組中的所有對象,這就是調用賦值運算符的原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM