Почему 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’