конструктор копирования по умолчанию и оператор присваивания по умолчанию - PullRequest
0 голосов
/ 09 августа 2011

В чем разница между любым из них, использованных в коде, как я использовал здесь . (Строка 44, строка 45 и обе работают нормально)

Выдержка:

Date temp = *this;  //ASSIGNMENT OPERATOR CALL(PROVIDED BY COMPILER)
//Date temp(*this); //COPY CONSTRUCTOR CALL(PROVIDED BY COMPILER)

Мое мнение : Это то, что во время назначения, как object1 = object2;содержимое объекта2 удаляется и помещается в объект1, в то время как, если то же самое происходит с помощью конструктора копирования, содержимое объекта2 все еще остается (я имею в виду то же самое, что и слово «копия»).

ПРИМЕЧАНИЕ: Кстати, мойКод прекрасно скомпилирован в Microsoft Visual C ++ 2008, но он выдал предупреждение

  prog.cpp: In function ‘std::ostream& operator<<(std::ostream&, const Date&)’:
  prog.cpp:103: warning: deprecated conversion from string constant to 

на ideone.com. Есть причины для этого.

Ответы [ 3 ]

4 голосов
/ 09 августа 2011
Date temp = *this; 
Date temp(*this); 

Конструктор копирования обоих вызовов,
Первый называется Инициализация копирования , а второй - Прямая инициализация .

Простое правило для запоминанияэто:
Если объект создается и инициализируется в том же операторе, он вызывает конструктор копирования.

Если объект только что назначен и не создается в том же операторе, то он вызывает оператор Assignment (Copy Assignment).


Компилятор жалуется, потому что:

Обычный строковый литерал имеет тип «массив из n константных символов».И неявное преобразование из const в неконстантную квалификацию для строковых литералов (4.2) не рекомендуется.

Ссылки:
Стандартный раздел C ++ [2.13.4 / 2]:
Обычный строковый литерал имеет тип array of n const char, где n - размер строки, как определено ниже;он имеет статическую продолжительность хранения (3.7) и инициализируется заданными символами.

раздел Приложения D [D.4 / 1]
неявное преобразованиес const до non-const квалификация для string literals (4.2) устарела.

Поэтому, чтобы избежать предупреждения, вы должны использовать:

static const char *monthName[13]
      ^^^^^^^ 
1 голос
/ 09 августа 2011

Разница между конструктором копирования по умолчанию и оператором назначения по умолчанию заключается в том, что при вызове оператора назначения члены принимающего объекта уже инициализируются значениями, и вы просто заменяете их копиями значений во втором объект. В конструкторе копирования элементы инициализируются как копии элементов во втором объекте. Второй объект не должен зависеть ни от одной операции.

Однако вы не используете оператор присваивания в своем коде, вы используете конструктор копирования. Если вы сделали это:

Date temp;
temp = *this;

Тогда вы будете использовать оператор присваивания.

1 голос
/ 09 августа 2011
static char *monthName[13]

может / должно быть

static const char *monthName[13]

чтобы избежать предупреждения.

...