我有一个带有两个函数的模板类,摘录如下;
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
这应该调用复制构造函数,而不是
operator=()
,因为这不是赋值语句。这是初始化。
operator=()
。在赋值过程中,旧对象会被更新并具有给定值。那么,你为
TYPE
定义了复制构造函数吗?
我假设在第一种情况下替换了复制构造函数,但不明白为什么。
这正是正在发生的事情。 C++ 标准强制要求这种行为。您应该让复制构造函数执行与赋值运算符相同的操作。
TYPE Element = newElement;
这实际上是构造,而不是复制运算符语法。因此,它将调用复制构造函数。
TYPE Element;
Element = newElement;
将按照您的预期调用赋值运算符,因为 = 在构造的对象上调用 - 同样,数组中的所有对象都被构造,这就是调用赋值运算符的原因。
我也有同样的问题。 我想我会说这是一个 C++ bug。