如果所引用的对象不是const对象,则“ const”关键字用于引用的目的是什么? r1和r2(下)之间有什么区别?
int i = 42; // non const object
const int &r1 = i; // const reference to non const object
int j = 25; // non const object
int &r2 = j; // non const reference to non const object
这是CPP Primer 5th的报价:
“ C ++程序员倾向于将短语“对const的引用”缩写为 “常量引用”。这个缩写很有意义-如果您还记得的话 是缩写。 从技术上讲,没有const引用。参考不是 对象,因此我们无法将引用本身设为const。确实,因为那里 从某种意义上讲,是没有办法使引用引用不同的对象 引用是常量。引用是引用const还是非const 类型会影响我们可以使用该引用执行的操作,而不是是否可以更改 引用本身的绑定。”
我认为这意味着在引用非const对象时将其引用为“ const”绝对没有任何作用。定义引用时,我们最好也删除const关键字。
在此处提出问题以进行确认。
编辑:看起来我最初的猜想是错误的。我现在了解,对非const对象的const引用确实有一个目的:防止引用修改该对象。仍然可以通过其他方式修改非const对象,但不能通过此const引用对其进行修改。
谢谢。
答案 0 :(得分:2)
要更好地理解它,可以研究const指针与指向const数据的指针之间的区别:
int i, j;
const int *p1 = &i; // pointer to constant int
int *const p2 = &i; // constant pointer to int
*p1 = 0; // error, p1 points to const int
*p2 = 0; // it is fine sets i to 0
p1 = &j; // fine p1 now points to anbother int
p2 = &j; // error, p2 is a constant pointer
所以现在,如果我们替换指向引用的指针,我们可以看到类似的内容,除了引用本身是不可改变的,即您不能在创建另一个对象之后就引用另一个对象(与非常量指针不同),并且任何引用都像常量指针。因此,这种意义上的const引用毫无意义,通常const引用是指对const类型的引用。那引物是什么意思。
对于代码中的差异,是的,存在差异-您无法通过const引用更改对象,无论该引用是否指向const对象都没有关系。
答案 1 :(得分:2)
“如果所引用的对象不是const对象,则引用const的目的是什么?” 目的是防止该引用被用来修改它所引用的对象。
int i = 42; // non const object
const int &r1 = i; // const reference to non const object
r1 = 6 * 9; // error, r1 cannot be used to modify i;
答案 2 :(得分:1)
有一种有用的方法可以弄清const
的含义在指针和引用中的含义,即从右到左读取声明(请参见these answers)。因此,const int &r1
可以理解为“ r1
是对int const
的引用”。
基本上,r1
是指无法修改的int
。这意味着所引用的int
是const int
,或,它是简单的int
。将const
const引用绑定到非const
对象(例如,编写类似int i = 5; const int& r = i;
的对象时)是完全合法的,因为不修改非{{ 1}}对象。
答案 3 :(得分:0)
我认为这意味着在引用非const对象时将其引用为“ const”绝对没有任何作用。定义引用时,我们最好也删除const关键字。
不正确。
您不能通过const
引用修改非const
对象。
您可以 通过非const
引用来修改非const
对象。
除非在程序的只读部分中创建了对象,否则该对象可以进行修改而不会产生不利影响。但是,当您使用const
对非const
对象的引用时,是在要求编译器不要让您通过该特定引用来修改对象。这并不意味着您不会修改对象。
它类似于函数参数。当函数使用const
引用参数类型时,该函数向您保证不会修改该对象。这并不意味着该对象根本不可修改。
答案 4 :(得分:0)
如果我们将const与变量一起使用,则其值不能更改;当将其与const引用一起使用时,如果将其与对象一起使用,则不能更改其引用,而在对象中使用整个数据则不能更改。