C ++ передается по ссылке на конструктор.Будет ли участник полной приватной копией? - PullRequest
0 голосов
/ 06 февраля 2012

В C ++ у меня есть конструктор, который принимает объект класса descriptor.Этот класс недавно вырос в размере, и мне нужно передать его по ссылке больше.Если я передам его по ссылке в следующий ctor, будет ли член по-прежнему делать свою собственную копию, учитывая, что он не объявлен как ссылочный тип?

Ответы [ 4 ]

2 голосов
/ 06 февраля 2012

Ваш конструктор сделает копию, что угодно.Если вы передадите по значению, то вы можете сделать 2 копии, однако компилятор, вероятно, оптимизирует одну из них.

Тем не менее, лучший вариант - принять константную ссылку, т.е.

Конечно, как только мы войдем в мир C ++ 11 и переместим конструкторы, вам вообще не нужно будет делать никаких копий, если передаваемая копия больше не нужна.Даже сейчас есть способы сделать это, но для этого требуется специальный «взлом» внутри объекта или использование умных указателей.

2 голосов
/ 06 февраля 2012

Член класса объявлен как объект, поэтому он является объектом.

Ссылка, переданная конструктору, будет использоваться для инициализации члена, используя его конструктор копирования.

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

1 голос
/ 06 февраля 2012

Изменение параметра с descriptor на descriptor& все равно приведет к копированию переменной-члена taskedStats (с использованием конструктора копирования) из аргумента taskedStats.

Чтобы избежать копирования, вы могли бы сделать переменную-член taskedStats a descriptor&, но это означает, что аргумент taskedStats должен быть действительным в течение времени жизни CWorkerThreadобъект (в этом случае отсутствие аргумента taskedStats a const descriptor& предотвратит передачу временных объектов).

0 голосов
/ 06 февраля 2012

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

descriptor(const descriptor &other);

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

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

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