2011-02-17 80 views
1

我有兩個功能,如下圖所示提取模板類;賦值運算符不總是叫

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 

' 
' 
} 

爲什麼第一種情況導致淺拷貝,但在深拷貝第二種情況?我假設複製構造函數在第一種情況下被替換,但不明白爲什麼。

回答

6

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

它會調用拷貝構造函數,而不是operator=(),因爲這不是賦值語句。這是初始化。

  • 初始化調用拷貝構造函數。在初始化時,一個新的對象是,構造爲
  • 分配調用operator=()。在賦值中,舊對象是已更新具有給定值。

那麼,你是否定義了TYPE的複製構造函數?

+0

我有一個拷貝構造函數,但它有增加了第二個參數,因此沒有被用作默認的拷貝構造函數。必須重新閱讀這些日子之一,太久了。 – 2011-02-17 11:26:52

3

我假設複製構造函數在第一種情況下被替換,但看不到原因。

即到底發生了什麼。 C++標準規定了這種行爲。你應該讓你的拷貝構造函數和你的賦值操作符做同樣的事情。

0
TYPE Element = newElement; 

這實際上是構造,而不是複製操作符語法。因此,它會調用複製構造函數。同樣,你的陣列中的所有對象構造,這就是爲什麼賦值運算符調用 - 像您期望的=調用構造的對象

TYPE Element; 
Element = newElement; 

將調用賦值運算符。