оператор присваивания не всегда вызывается - PullRequest
1 голос
/ 17 февраля 2011

У меня есть шаблон класса с двумя функциями, выдержки показаны ниже;

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 ]

6 голосов
/ 17 февраля 2011

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

Это должно вызвать конструктор копирования, а не operator=(), так как это не оператор присваивания. Это инициализация.

  • Инициализация вызывает конструктор копирования. При инициализации новый объект создается .
  • Назначение вызывает operator=(). При назначении старый объект обновляется с заданным значением.

Итак, вы определили конструктор копирования для TYPE?

3 голосов
/ 17 февраля 2011

Я предполагаю, что в первом случае заменяется конструктор копирования, но не понимаю, почему.

Это именно то, что происходит. Стандарт C ++ предписывает такое поведение. Вы должны заставить ваш конструктор копирования делать то же самое, что и ваш оператор присваивания.

0 голосов
/ 17 февраля 2011
TYPE Element = newElement;

Это на самом деле конструкция, а не синтаксис оператора копирования.Таким образом, он вызовет конструктор копирования.

TYPE Element;
Element = newElement;

Запустит оператор присваивания, как вы ожидаете, так как = вызывается для построенного объекта - аналогично, все объекты в вашем массиве создаютсяпочему вызывается оператор присваивания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...