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

问题描述 投票:0回答:4

我有一个带有两个函数的模板类,摘录如下;

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

'
'
}

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

c++ constructor variable-assignment
4个回答
8
投票

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

这应该调用复制构造函数,而不是

operator=()
,因为这不是赋值语句。这是初始化。

  • 初始化调用复制构造函数。在初始化过程中,构造了一个新对象。
  • 赋值调用
    operator=()
    。在赋值过程中,旧对象会被更新并具有给定值。

那么,你为

TYPE
定义了复制构造函数吗?


3
投票

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

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


0
投票
TYPE Element = newElement;

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

TYPE Element;
Element = newElement;

将按照您的预期调用赋值运算符,因为 = 在构造的对象上调用 - 同样,数组中的所有对象都被构造,这就是调用赋值运算符的原因。


0
投票

我也有同样的问题。 我想我会说这是一个 C++ bug。

© www.soinside.com 2019 - 2024. All rights reserved.