Вопрос относительно вызова конструктора копирования C ++ - PullRequest
1 голос
/ 15 сентября 2011

Я пытаюсь выяснить разницу между этими двумя строками кода ..

Нам дают 'Count' - это имя нашего класса, C1 и C2 - объекты этого класса Никакой информации о том, как и когда были объявлены классы, не предоставлено.

Count C2(C1); //Statement 1
Count C2=C1;  //Statement 2

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

Спасибо!

Ответы [ 4 ]

4 голосов
/ 15 сентября 2011

На грамматическом уровне первый называется «прямой инициализацией», а второй - «инициализацией копирования».Если Count имеет тип класса (т. Е. Не typedef, скажем, int), то обе версии эквивалентно вызывают конструктор копирования.

Первая версия работает в любом случае,вторая версия не работает, если конструктор копирования объявлен explicit.

1 голос
/ 15 сентября 2011

В утверждении 1 C2 будет использовать конструктор копирования для конструирования себя из C1.
В операторе 2 C2 будет использовать конструктор копирования для конструирования себя из C1; -или-, если конструктор копирования не доступен, он будет конструировать себя по умолчанию, а затем использовать оператор присваивания из C1 для назначения себя. Я не думаю, что Заявление 1 имеет такую ​​возможность.

1 голос
/ 15 сентября 2011

Копировать инициализацию

Count C2=C1; //Statement 2

Копировать инициализацию создает неявную последовательность преобразования: она пытается преобразовать C1 в объект типа Count.Если в конструкторе копирования используется ключевое слово explicit, его можно подавить, и компилятор выдаст ошибку.


Прямая инициализация

Count C2(C1); //Statement 1

Прямая инициализация ведет себя как вызов функции для конструкторов Count (включая явные), а аргумент c1 передается вызываемому конструктору.При разрешении перегрузки будет найден наиболее подходящий конструктор, а при необходимости будет выполнено любое неявное преобразование.

0 голосов
/ 15 сентября 2011

Компилятор видит их как одинаковые.

Count C2 = Count(C1);
Count C2(C1);
Count C2 = C1;

Все они вызовут конструктор копирования.


Однако это не одно и то же:

Count C2;
C2 = C1;

Это создаст C2 с использованием конструктора по умолчанию, затем используйте operator=, чтобы присвоить ему C1.

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