Выбор параметра для конструктора копирования - PullRequest
1 голос
/ 19 сентября 2009

Недавно меня спросили в интервью о параметре для конструктора копирования.
[Изменено] Как разработчик языка C ++, реализующего функцию конструктора копирования, зачем выбирать постоянный ссылочный параметр вместо константного указателя на константный объект.

У меня было несколько идей, например, так как указатель может быть назначен на NULL, что, вероятно, не имеет смысла (семантически) в конструкторе копирования, и тот факт, что переменная указателя является независимым объектом (что, вероятно, не будет хорошим в терминах эффективности), в то время как ссылка является просто псевдонимом к реальному объекту (следовательно, лучший способ передать объект).
Есть другие идеи?

Ответы [ 3 ]

6 голосов
/ 19 сентября 2009

Потому что Страуструп хотел, чтобы классы были похожи на примитивные типы. Когда вы инициализируете переменную int:

int x = 5;
int y = x; // Why would you write int y = &x; ?

Передача константного указателя на константный объект не согласуется с тем, что C ++ принес в C. классы в C ++ являются просто пользовательскими типами, если они не работают как примитивные типы, то чем они являются?

Другим примером, где программирование на C ++ было бы несчастным без ссылок, является перегрузка операторов. Представьте, что вы должны написать:

myclass myobj1, myobj2, myobj3;
&myobj3 = &myobj1 + &myobj2;
1 голос
/ 19 сентября 2009

Это синтаксическое удобство.

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

Если бы у конструктора копирования был параметр, который был указателем, а не ссылкой, вам нужно было бы применить оператор address-of для вызова конструктора копирования, что было бы неудобно.

0 голосов
/ 19 сентября 2009

Я считаю, что важной причиной не использовать указатели в конструкторах копирования является то, как временные привязки привязываются к r-значениям. Для указателей будет возможно сохранить указатель на временный и использовать его позже с неопределенным поведением, со ссылками сложнее хранить и использовать ссылки, проще использовать фактические значения.

...