Амперсанд & с константой в конструкторе - PullRequest
6 голосов
/ 03 апреля 2012

Может ли какое-то тело сказать мне причину, почему мы обычно помещаем const и & с некоторым объектом, который передается, например, в конструктор.используется в функции some, потому что значение передается по ссылке, и любые изменения, произошедшие с этой переменной в функции, должны отражаться впоследствии.Но с другой стороны, const говорит, что нельзя присвоить эту переменную.

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

Ответы [ 6 ]

8 голосов
/ 03 апреля 2012

Это сделано, чтобы избежать ненужной копии. Взять, к примеру, следующий код:

Book::Book(Date date):
date_(date)
{
}

Когда вы вызываете этот конструктор, он копирует date дважды, один раз, когда вы вызываете конструктор, и один раз, когда вы копируете его в переменную-член.

Если вы сделаете это:

Book::Book(const Date &date):
date_(date)
{
}

date копируется только один раз. По сути, это просто оптимизация.

5 голосов
/ 03 апреля 2012

Наиболее распространенной альтернативой является передача по значению:

Book::Book(Date date);

Передача по константной ссылке предотвращает копирование параметра date, когда передаваемый параметр уже равен Date.Копирование объектов может быть ненужным, может быть дорогостоящим, или может привести к нарезке объекта (и неправильным результатам).

'Slicing' - это, в основном, понижение типа объекта посредством копирования в его базу.Для полиморфного типа это может фактически изменить его поведение, потому что параметр будет скопирован как его основа (Date), а затем вызовы к его полиморфным интерфейсам будут другими, потому что реализация изменилась (например, его виртуальные методы будут использовать базуреализация вместо).

2 голосов
/ 03 апреля 2012

Это означает, что вы передаете объект через refrence (как вы заметили), но сам объект не может быть изменен из функции (в данном случае ctor).

Причиной этого может быть:

  • вы не хотите копировать весь объект, чтобы сделать ваш код более эффективным
  • вы не хотите случайно изменять переданный объект
  • вы хотите иметь возможность использовать функцию с неназванными временными символами
  • вы хотите иметь возможность передавать объекты, производные от отмеченного типа (Date в данном случае)

В качестве третьего пункта рассмотрим:

Book b(Date());
0 голосов
/ 03 апреля 2012

В c ++, когда у вас есть тип параметра функции, похожий на const Type&, то, что вы делаете, позволяет пользователю передать какое-то значение в по ссылке - указатель на значение неявно передается, но для простоты использования компилятор позволяет обрабатывать его так, как если бы это было значение.

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

Причина, по которой используется const, заключается в том, чтобы защитить себя от изменения памяти, которую пользователь не ожидает от вас, и также заставить его работать, даже если пользователь передает переменную const.

0 голосов
/ 03 апреля 2012

Обычно это оптимизация производительности для входных параметров.Если вы опустите '&', параметр будет принят значением, а входной объект должен быть скопирован перед передачей в функцию.Передача по ссылке обходит копию.

0 голосов
/ 03 апреля 2012

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

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