[英]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.