在C ++入门中,我发现const int &
可以与int对象绑定。我不明白,因为我认为const int &
应该与const int
绑定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
的价值可以为&#39}。改变了,但是当我在visual studio中调试以下编码时,我发现它不对:
int a=0;
const int &r=a;
a=3;
cout<<r<<endl;
输出是r=3;
可以更改r
的值,为什么?我不明白。
答案 0 :(得分:15)
不明白,因为我认为
const int &
应该与const int
而不是int
对象绑定
你错了。引用const(简称const引用)并不意味着只能绑定const对象。这意味着无法通过引用修改对象。
不允许的是将非const引用绑定到const对象,因为这样的引用可用于修改会破坏const的对象。
可以更改
r
的值,为什么?
r
引用的对象已被修改 - 这是正常的,因为该对象不是const。 r
仍然引用同一个对象,并且未使用r
修改对象。
拥有const引用并不意味着引用的对象不能更改。这意味着无法使用该引用更改对象。
如果您希望拥有一个无法更改的对象,那么该对象本身必须是const。 const引用不会使引用的对象成为const。本书向您展示了如何创建const对象:
const int b=a;
我错误地认为引用是poiter,因为它们在某个时候是相似的。
实际上,引用与指针非常相似。关于这个问题的背景,他们的行为类似。演示:
int a=0;
const int *r=&a;
a=3;
cout<<*r<<endl;
答案 1 :(得分:6)
const
仅保证在a
使用的地方无法更改r
。通常这用于不改变输入参数的函数,如:
int doNotModifyFoo(const int &foo);
答案 2 :(得分:4)
无法修改对象&#34;通过&#34; const
引用或指向const
的引用。但const
引用或指向const
的指针并未对基础对象施加任何类型的运行时锁定(假设它未被声明为const
)原始声明或任何非const
引用或指向非const
的指针仍可用于修改它。
确实如果对象最初没有被声明const
,那么const
- ness可以被抛弃并用于修改底层对象。
实际上,即使最初声明对象const
,这也许是可能的(但是依赖于实现)。
const
是一种表示函数(或多个函数)不应修改对象的方式(作为返回值输出或声明中的参数)。
它(通常)意味着不能通过该对象或其他参考/指针修改对象。
也无法修改引用引用的内容。或者至少没有有效的方法。在某些情况下,在实践中,jiggery pokery可能获得一个引用所在的地址并像指针一样修改它。在某些情况下,这通常会失败,因为引用经常被优化而不存在,并且因为编译器知道它们不能被修改&#39;此类违规行为可能只是部分成功。
答案 3 :(得分:3)
在C ++中,您可以使用引用和/或const指针来引用非const对象。
int x = 10;
const int& r = x; //OK
const int* p = &x; //OK
当然,由于x不是常数,因此可以改变。但是,通过对非const对象进行const引用,您基本上所说的是:我不会通过此引用/指针 更改此对象。您仍然可以直接或通过其他引用或指针更改对象。
将其视为只读句柄。是的,对象本身可能是可变的,但在许多情况下,您可能愿意获取和/或仅提供对该可变变量的只读访问权。
答案 4 :(得分:2)
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
,则无法通过“代理”修改对象。但是,这并不意味着原始对象无法修改。
答案 5 :(得分:2)
基本上,const int & r
承诺不会改变它引用的值。这比int &
更有力。因此,可以使用int
引用来引用const int &
。但你可能不会修改它。它是该值可能的操作的子集。但是,反之亦然,如果您尝试获取int &
const int
值的int &
引用,则会导致编译器错误,因为值本身是不可变的,并且您正在尝试获取对此不可变值的可变引用。 const int
引用上可能的操作是String parentwindowhandler= drive.getWindowHandle(); // store your parent window..
String subwindowhandler=null;
Set<String> handles= drive.getWindowHandles();
Iterator<String> iterator= handles.iterator();
while(iterator.hasNext()){
subwindowhandler= iterator.next();
}
drive.switchTo().window(subwindowhandler); // switch to child window..
值可能的超集。
答案 6 :(得分:2)
变量a
的值0
最初是在内存中保留的。
如果你稍后写:a=5
,它会将内存中的值设置为5
。
当你写一个引用const int & r = a;
时,你只是说r
应该访问内存5
的同一个地方。
由于a
不是const
,因此可以修改该值。
基本它是如何运作的。
答案 7 :(得分:1)
有两件事: Const和参考。
引用只是同一内存单元的另一个名称。您可以使用任何名称来更改该内存中保存的值。
const 引用在C ++中用类似
的代码表示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’