C ++对非Const对象的Const引用与非Const对象的非Const引用之间的区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C ++对非Const对象的Const引用与非Const对象的非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 to const“缩写为”const reference“。这个缩写是有意义的 - 如果你记得它是一个缩写。从技术上讲,没有const引用。引用不是一个对象,所以我们不能自己做一个引用const。的确,因为没有办法让引用引用一个不同的对象,在某种意义上所有引用都是const。引用是指const还是nonconst类型会影响我们可以用它做什么引用,而不是我们是否可以改变引用本身的绑定。“

我认为这意味着在引用非const对象时将引用设为“const”绝对没有任何意义。在定义引用时,我们也可以将const关键字取出。

在这里提出这个问题以供确认。

编辑:看起来我的初步推测是错误的。我现在明白对非const对象的const引用确实有一个目的:防止引用修改对象。非const对象仍然可以通过其他方法修改,但不能通过此const引用修改。

谢谢大家。

答案

“如果引用的对象不是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;
另一答案

为了更好地理解它,你可以研究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对象。

另一答案

有一种有用的方法可以找出constness在指针和引用中的含义,即从右到左阅读声明(参见these answers)。所以const int &r1可以被解读为“r1是对int const的引用”。

基本上,r1指的是不能修改的int。这意味着所提到的int要么是const int,要么是简单的intconst const引用与非const对象的绑定(例如,当编写像int i = 5; const int& r = i;这样的东西时)是完全合法的,因为没有修改非const对象没有错。

另一答案

我认为这意味着在引用非const对象时将引用设为“const”绝对没有任何意义。在定义引用时,我们也可以将const关键字取出。

不对。

您不能通过const参考修改非const对象。 您可以通过非const参考修改非const对象。

除非在程序的只读部分中创建对象,否则它可以进行修改而不会产生不良后果。但是,当您对非const对象使用const引用时,您要求编译器不允许您通过该特定引用修改对象。这并不意味着您不会修改对象。

它与函数参数类似。当函数使用const引用参数类型时,该函数向您承诺它不会修改该对象。这并不意味着对象根本不可修改。

另一答案

如果我们将const与变量一起使用,那么它的值不能改变,当它与const引用一起使用时,如果我们将它与对象一起使用则不能改变它的引用,那么整个数据在对象中使用它不能被改变。

以上是关于C ++对非Const对象的Const引用与非Const对象的非Const引用之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

C# 字段初始值无法引用非静态字段、方法或属性

C#非静态的字段、方法或属性要求对象引用

VS提示“非静态的字段,方法或属性要求对象引用”

字段初始值无法引用非静态字段、方法或属性

字段初始值设定项无法引用非静态字段、方法或属性

字段初始值设定项无法引用非静态字段、方法或属性