赋值运算符并不总是被调用

时间:2011-02-17 11:10:42

标签: c++ constructor variable-assignment

我有一个带有两个函数的模板类,如下所示:

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

'
'
}

为什么第一种情况导致浅拷贝,而第二种情况导致深拷贝?我假设在第一种情况下正在替换复制构造函数,但不明白为什么。

3 个答案:

答案 0 :(得分:6)

  

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

这应该调用copy-constructor,而不是operator=(),因为这不是赋值语句。这是初始化。

  • 初始化调用copy-constructor。在初始化中,新对象是构造的
  • 作业调用operator=()。在分配中,旧对象已更新且具有给定值。

那么,您是否为TYPE定义了一个拷贝构造函数?

答案 1 :(得分:3)

  

我假设在第一种情况下正在替换复制构造函数,但不明白为什么。

这正是发生的事情。 C ++标准强制要求这种行为。您应该让复制构造函数与赋值运算符执行相同的操作。

答案 2 :(得分:0)

TYPE Element = newElement;

这实际上是构造,而不是复制操作符语法。因此,它将调用复制构造函数。

TYPE Element;
Element = newElement;

将在构造对象上调用=时调用赋值运算符 - 同样,构造数组中的所有对象,这就是调用赋值运算符的原因。

相关问题