常量引用非常量对象和常量引用非常量对象之间的C ++差异

时间:2018-08-30 18:43:19

标签: c++ reference const

如果所引用的对象不是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引用对其进行修改。

谢谢。

5 个答案:

答案 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。这意味着所引用的intconst 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引用一起使用时,如果将其与对象一起使用,则不能更改其引用,而在对象中使用整个数据则不能更改。