为什么const int&绑定到int?

时间:2017-05-22 14:10:34

标签: c++ c++11 reference

在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;

但我认为这本书不对,因为如果在ba之间存在r之类的临时性,则r的价值可以为&#39}。改变了,但是当我在visual studio中调试以下编码时,我发现它不对:

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

输出是r=3;可以更改r的值,为什么?我不明白。

8 个答案:

答案 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;

这将是一个错误,因为rconst 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的同一个地方。 enter image description here

由于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’