C++ 对非常量对象的常量引用和对非常量对象的非常量引用之间的区别

C++ Difference Between Const Reference to Non Const Object and Non Const Reference to Non Const Object

本文关键字:常量 非常 引用 对象 区别 之间 C++      更新时间:2023-10-16

如果引用的对象不是 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' 关键字的目的是什么?" 目的是防止该引用用于修改它所引用的对象。

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;

为了更好地理解它,你可以看看常量指针和指向常量数据的指针之间的区别:

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 int &r1可以理解为"r1是对int const的引用"。

基本上,r1是指无法修改的int。这意味着引用的int要么是const int要么是一个简单的int。将const常量引用绑定到非const对象(例如,在编写类似int i = 5; const int& r = i;的内容时(是完全合法的,因为不修改非const对象并没有错。

我认为这意味着当引用非常量对象时,使引用成为"const"绝对没有任何作用。在定义该引用时,我们不妨去掉 const 关键字。

不对。

您不能通过const引用修改非const对象。
您可以通过const引用修改非const对象。

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

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

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

还值得一提的是,当您将两者传递给函数调用时的行为 fun1(const int&R1( vs. fun2(int & R1(

在 fun1中,您可以使用成本或变量来调用它,例如 fun1(5( 或 fun1(var1(; 假设 int var1=5;

在 fun2 中,你根本不能用 const 调用它,fun2(5( 会给你编译器错误,这意味着在这种情况下,你必须添加另一个重载实现来覆盖这种情况。糟糕的设计!