C++ 对非常量对象的常量引用和对非常量对象的非常量引用之间的区别
C++ Difference Between Const Reference to Non Const Object and Non Const Reference to Non Const Object
如果引用的对象不是 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( 会给你编译器错误,这意味着在这种情况下,你必须添加另一个重载实现来覆盖这种情况。糟糕的设计!
- #定义c-预处理器常量..我做错了什么
- 用C++中的一个变量定义一个常量
- 什么时候在C++中返回常量引用是个好主意
- 代理对象的常量正确性
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 通过多个头文件使用常量变量
- 在cuda线程之间共享大量常量数据
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 是默认情况下分配给char数组常量的值
- 私有类型的静态常量成员
- OpenGL大的3D纹理(>2GB)非常慢
- 类似枚举的计算常量
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 使用常量键但非常量值进行映射
- 为什么`is_open()`非常常量
- 从getter方法返回常量和非常量值
- 阻止const类函数在引用成员上调用非常常量类函数
- C++初始化非常大的常量数组,最佳实践
- 提高c++中非常大的常量的可读性