我有一个带有两个函数的模板类,如下所示:
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
'
'
}
为什么第一种情况导致浅拷贝,而第二种情况导致深拷贝?我假设在第一种情况下正在替换复制构造函数,但不明白为什么。
答案 0 :(得分:6)
TYPE Element = newElement; <--- TYPE operator= not called, shallow copy
这应该调用copy-constructor,而不是operator=()
,因为这不是赋值语句。这是初始化。
operator=()
。在分配中,旧对象已更新且具有给定值。那么,您是否为TYPE
定义了一个拷贝构造函数?
答案 1 :(得分:3)
我假设在第一种情况下正在替换复制构造函数,但不明白为什么。
这正是发生的事情。 C ++标准强制要求这种行为。您应该让复制构造函数与赋值运算符执行相同的操作。
答案 2 :(得分:0)
TYPE Element = newElement;
这实际上是构造,而不是复制操作符语法。因此,它将调用复制构造函数。
TYPE Element;
Element = newElement;
将在构造对象上调用=时调用赋值运算符 - 同样,构造数组中的所有对象,这就是调用赋值运算符的原因。