const reference和nonconst reference的区别

本文详细解释了C++中普通引用和常量引用的使用规则,包括如何正确初始化引用及引用到不同类型变量的情况,并通过示例代码说明了这些规则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

普通的reference必须用与该引用同类型的对象来初始化。例如:
  1. int ival = 1024;
  2. int &refVal = ival;   // ok: refval refers to ival
  3. int &refVal2;         // error: 引用必须初始化
  4. int &refVal3 = 10;    // error: 必须用对象进行初始化,而不能是字面值常量(literal constant)
  5.  
  6. const int ival2 = 256;
  7. int &refVal4 = ival2; // error: 注意const int和int是不同类型
  8.  
  9. register int ival3(512);
  10. int &refVal5 = ival3; // ok: 不管是寄存器变量还是自动变量
而const reference的限制则没那么多。例如:
  1. const int ival = 1024;
  2. const int &refVal1 = ival;  // ok: 类型匹配
  3. const int &refVal2 = 1024;  // ok: 1024称为字面值常量(literal constant),也是const int类型,匹配

  4. const int &refVal3 = ival + 256; // ok: 可以用表达式
  5. const int &refVal4 = fnc(); // ok: 可以是函数返回值

  6. double dval = 3.14;
  7. const int &ri = dval;    // ok: 可以是不同类型
实际上09行在编译时编译器会把它转化为形如
  1. const int temp = dval;
  2. const int &ri = temp;
注意到隐式转换从double型转为const int型,编译时会出现一个warning

参考:
C++ Primer中文版(第4版)
### 非const左值引用的概念 非`const`左值引用是指向一个非常量对象的引用,该引用必须绑定到一个具有相同类型的左值。这种引用允许通过它修改所引用的对象。由于其特殊性质,在C++编程中有广泛的应用场景。 #### 绑定规则 对于常规引用(即左值引用),不能将其绑定到要求转换的表达式、字面常数或是返回右值的表达式上[^5]。这意味着如果尝试将临时对象或字面量赋给非`const`左值引用,则会引发编译错误。 ```cpp // 正确:绑定到已命名变量 int a = 10; int& ref_a = a; // 错误:试图绑定到字面量 int& ref_b = 20; // 编译失败 ``` #### 修改能力 因为是非`const`引用,所以可以通过这个引用来改变原始数据的内容: ```cpp ref_a = 30; std::cout << "a 的新值:" << a << std::endl; // 输出新的数值 ``` 上述例子展示了如何利用非`const`左值引用来更新原对象的状态。 #### 函数参数传递中的应用 当作为函数形参时,使用非`const`左值引用可以避免不必要的拷贝开销,并且能够直接操作实参与之关联的实际内存位置上的数据: ```cpp void increment(int &val){ val += 1; } int main(){ int num = 42; increment(num); std::cout << "num after incrementing:" << num << '\n'; // 应输出43 } ``` 这里`increment()`接受的是传入整型变量的一个引用而不是副本,因此可以在不复制的情况下对其进行更改。 #### 返回局部变量地址的风险 需要注意的一点是在某些情况下可能会遇到悬空指针的问题——特别是当你打算从函数内部返回指向栈分配资源(如自动存储持续期内的本地对象)的引用时。这会导致未定义行为,应该尽量避免这样做除非确实必要并采取适当措施确保安全。 ```cpp int& bad_reference(){ int temp=99; return temp; // 危险做法!temp离开作用域后不再有效 } ``` 综上所述,理解非`const`左值引用的工作原理及其适用范围有助于编写更高效且不易出错的现代C++程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值