2011-02-17 82 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; 

将调用赋值运算符。