делает = при объявлении переменной так же, как конструктор копирования c ++? - PullRequest
2 голосов
/ 21 января 2012

Я сделал время урока и объявил в основном:

time a;
time b=a;

это то же самое, что:

time b(a);

???Я также сделал функцию:

time f(time t)
{
  return t;
}

и использовал ее в main после объявления:

time b=f(a);

Я печатал сообщения, когда вызывался конструктор копирования, Результатом было только 2 вызова конструктора копирования,один копирует a в t, другой копирует t для возврата, вот мой вопрос: не было вызова конструктора копирования для копирования значения, возвращенного функцией, в b?

заранее спасибо!

Ответы [ 4 ]

2 голосов
/ 21 января 2012

Вопрос в вашей шапке и вопрос внизу вашего поста разные. Для того, кто в вашем заголовке:

делает = при объявлении переменной так же, как конструктор копирования c ++?

Не совсем. Сначала выражение с правой стороны преобразуется в тип с левой стороны, а затем вызывается конструктор копирования. Это требует неявного преобразования. Если это невозможно, инициализация не будет компилироваться. Если выражение с правой стороны уже является правильным типом, то первый шаг не требуется.

Для вашего другого вопроса, это оптимизация возвращаемого значения .

2 голосов
/ 21 января 2012

Да, time b = a эквивалентно time b( a ), поскольку вы объявляете объект и присваиваете его значение одновременно.

Что касается второй части вашего вопроса, то компилятор обычно удаляет ненужные копии объектов, где это возможно, в зависимости от уровня оптимизации.

0 голосов
/ 21 января 2012

когда объект создается из другого объекта, конструктор копирования называется как

время б = а; или время b (a);

но когда объект уже создан и вы хотите скопировать в него элементы, тогда оператор = называется

разница как при использовании динамически выделяемой памяти если вы используете конструктор копирования, это означает, что вы еще не созданы, поэтому вам не нужна очистка управления памятью

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

0 голосов
/ 21 января 2012

нет, b = a использует оператор присваивания (operator =) для создания нового пустого объекта времени, а затем вызывает оператор, чтобы переместить в него значения (или все, что вы скажете оператору = делать).

Часто вы обнаружите, что сгенерированные компилятором версии этого будут вызывать конструктор копирования, но это не обязательно.

Для справки найдите ключевое слово явное .Поскольку копирование объекта может быть выполнено двумя способами (копирование ctor и оператор присваивания), это указывает компилятору использовать копируемый ctor только при явном вызове, а не неявно.

Создайте свой класс со всеми различными конструкторами(включая новый c ++ 0x move one) и оператор присваивания и посмотрите, что происходит, когда вы запускаете его через отладчик.

...