Почему const int & bind для int?

В С++-праймер я обнаружил, что const int & может связываться с объектом int. Я не понимаю этого, потому что я думаю, что const int & должен связываться с объектом const int not a int, int объект может измениться, книга объясняет этот вопрос тем, что когда объект const int & связывается с int; между ними существует временный объект, например:

int a=0;
const int &r=a;

Мы можем использовать b как временное значение, поэтому выше равно:

const int b=a;
const int &r=b;

Но я думаю, что книга неправильная, потому что, если существует временная, как b, существующая между a и r, значение r не может быть изменено, но когда я отлаживаю следующее кодирование в visual studio, я обнаружил, что это неправильно:

int a=0;
const int &r=a;
a=3;
cout<<r<<endl;

Вывод: r=3; можно изменить значение r, почему? Я этого не понимаю.

Ответы

Ответ 1

не понимаю, потому что я думаю, что const int & должен связываться с объектом const int not a int

Вы ошибаетесь. Ссылка-на-const (короткая ссылка на константу) не означает, что могут быть связаны только объекты const. Это означает, что объект не может быть изменен с помощью ссылки.

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

можно изменить значение r, почему?

Объект, на который ссылается r, был изменен - ​​это нормально, потому что объект не const. r все еще относится к одному и тому же объекту, и объект не был изменен с помощью r.

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

Если вы хотите иметь объект, который не может измениться, тогда этот объект должен быть const. Ссылка на const не делает упомянутый объект const. В книге показано, как создать объект const:

const int b=a;

Я считаю ссылку как poiter ошибочно, потому что они похожи друг на друга.

Действительно, ссылки очень похожи на указатели. Что касается контекста этого вопроса, они ведут себя аналогичным образом. Демонстрация:

int a=0;
const int *r=&a;
a=3;
cout<<*r<<endl;

Ответ 2

const в этом примере гарантирует, что a не может быть изменено, если используется r. Обычно это используется для функций, которые не меняют входные параметры, такие как:

int doNotModifyFoo(const int &foo);

Ответ 3

Объект нельзя изменить "через" ссылку const или указатель на const. Но ссылка const или указатель на const не налагает никакой блокировки времени выполнения на базовый объект и (при условии, что он не был объявлен const) исходной декларации или любой ссылки не const или указатель на не const все еще можно использовать для его изменения.

В самом деле, если объект не был первоначально объявлен const, тогда const -ness можно отбросить и использовать для изменения базового объекта.

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

const - способ указать, что функция (или функции) не должна изменять объект (либо в качестве аргумента в нашем возвратном значении, либо в объявлении).

Это не означает, что объект не может быть изменен через этот или какой-либо другой указатель/указатель.

Также невозможно изменить ссылку на ссылку. Или, по крайней мере, нет действительного способа сделать это. В некоторых случаях на практике можно использовать jiggery pokery для получения адреса того, где хранится ссылка, и модификации его как указателя. В некоторых случаях это обычно терпит неудачу, поскольку ссылки часто оптимизируются из-за существования и потому, что компилятор знает, что они "не могут быть изменены", такие нарушения могут быть частично успешными.

Ответ 4

В С++ вы можете ссылаться на неконстантные объекты со ссылками и/или указателями на const.

int x = 10;
const int& r = x; //OK
const int* p = &x; //OK

Конечно, поскольку x не является константой, его можно изменить. Тем не менее, вы в основном говорите, имея ссылку на const для неконстантного объекта: Я не буду изменять этот объект с помощью этой ссылки/указателя. Вы по-прежнему можете изменять объект напрямую или через другие ссылки или указатели.

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

Ответ 5

int a=0;
const int &r=a;
a=3;
cout<<r<<endl;

Выходной сигнал равен r = 3; значение r можно изменить, почему? Я не понимайте это.

const применяется только к ссылке r. Это означает, что вы не можете изменить привязку r к r. Вы не можете:

r = 3;

Это будет ошибка, потому что r является const int& и не может быть изменен. Пока вы можете думать о ссылках как о каком-то легком прозрачном "прокси" объекта. Поэтому, если "прокси" const, вы не можете изменить объект через "прокси" . Однако это не означает, что исходный объект не может быть изменен.

Ответ 6

В принципе, const int & r promises не нужно изменять значение, которое оно ссылается. Это более надежная гарантия, чем int &. Таким образом, можно ссылаться на int, используя ссылку const int &. Но вы не можете изменять его. Это подмножество возможных операций над значением. Тем не менее, это не так, наоборот, если вы пытаетесь получить ссылку int & на значение const int, это приведет к ошибке компилятора, потому что само значение является неизменным, и вы пытаетесь получить изменяемый ссылаясь на эту неизменную ценность. Операции, доступные на ссылке int &, представляют собой надмножество возможного значения const int.

Ответ 7

Значение переменной a, которая 0 изначально сохраняется в памяти.

Если вы напишете позже: a=5, оно установит это значение в памяти на 5.

Когда вы пишете ссылку const int & r = a;, вы только говорите, что r должен иметь доступ к тому же месту в памяти, где 5 удерживается. введите описание изображения здесь

Поскольку a не const, он может изменить значение.

Это в основном, как это работает.

Ответ 8

Есть две вещи: Константа и ссылка.

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

A const ссылка обозначается в С++ кодом типа

int j =2; 
int const &i = j; //or Alternatively
const int &i = j;

Нет ограничений, которые также делают постоянным объект.

Здесь вы не можете использовать i для изменения значения j. Однако это не делает память j постоянной. Вы можете мирно изменить значение j.

j =3
//but i = 3 will raise an error saying 
//assignment of read-only reference ‘i’