Начинающий C ++: какой смысл использовать переменную по ссылке, если используется «const»? - PullRequest
4 голосов
/ 13 февраля 2012

Мне было интересно узнать о логике в этом объявлении функции:

CMyException (const std::string & Libelle = std::string(),...

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

Это противоречиво.

Может кто-нибудь объяснить мне это?

Ответы [ 6 ]

5 голосов
/ 13 февраля 2012

На самом деле ссылка используется, чтобы избежать ненужной копии объекта.

Теперь, чтобы понять, почему используется const, попробуйте это:

std::string & x= std::string(); //error

Это даст ошибку компиляции. Это связано с тем, что выражение std::string() создает временный объект, который нельзя привязать к неконстантной ссылке. Однако временное значение может быть связано со ссылкой const, поэтому необходимо const:

const std::string & x = std::string(); //ok

Теперь вернемся к конструктору в вашем коде:

CMyException (const std::string & Libelle = std::string());

Устанавливает значение по умолчанию для параметра. Значение по умолчанию создается из временного объекта. Следовательно, вам нужно const (если вы используете ссылка ).

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

throw CMyException("error"); 

Создает временный объект типа std::string из строкового литерала "error", и этот временный объект привязывается к ссылке const.

3 голосов
/ 13 февраля 2012

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

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

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

Передача примитивных типов (int, char, ..) по константной ссылке не имеет смысла. Даже для std::string Я бы сказал, что это не нужно.

Однако для больших структур или классов требуется копия при передаче по значению, так что здесь есть издержки. Ссылка const имитирует поведение передачи по значению (внешняя переменная не изменяется), но также предотвращает дополнительную копию.

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

Например, вы можете сделать это только с помощью const reference arguments:

CMyException("foo");

Подумайте об этом, и тогда все станет ясно.

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

Я обычно передаю все как const - я никогда не изменяю параметры, по значению для примитивных типов, по ссылке для пользовательских типов. Передача по значению для типов примитивов более эффективна в большинстве случаев - рассмотрите беззнаковое короткое замыкание - по значению 2 байта, по ссылке 4-8 байтов в зависимости от размера указателя.

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

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

С другой стороны, ссылочная переменная использует тот же объект и, по существу, передает только адрес памяти (такой же, как при использованииstd :: string *, за исключением того, что вы не можете использовать нулевой адрес памяти).Итак, когда вы делаете что-то вроде const std::string& x, вы говорите:

1. The passed argument will not be copied. The same object will be used as in memory.
2. The function will absolutely not modify the object that it is handling.

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

...