Reference (lvalue reference)

C++引用详解
本文深入讲解了C++中引用的概念及使用规范,包括引用初始化、类型匹配规则等,并通过实例说明了引用作为别名而非独立对象的特点。

  Reference

  A reference is not an object. Instead, a reference is just another name for an already existing object.
                             ----《C++ Primer英文版第五版》
  引用必需被初始化。
  引用的类型与引用相关连对象的类型必须一致。
  引用只能绑定到对象,不能绑定到字面量或表达式的结果上。
  int  ival = 100;
  int &refVal = ival; // refVal refers to (is another name for) ival
  int &refVal2;       // error: a reference must be initialized(引用必需被初始化)
  int &refVal3 = 10;  // error: initializer must be an object(初始化列表必需是对象)
  double pi = 3.14;
  int &refVal4 = pi;  // error: initializermust be an int object(类型不一致)

  Because references are not objects, we may not define a reference to a reference.
                             ----《C++ Primer英文版第五版》
  int &refVal5 = refVal; // ok: refVal5 is bound to the object to which refVal is bound,
              // i.e., to ival
                 // refVal5是ival的引用,而不是refVal的引用,因为引用不是对象,
              // 又只能用对象初始化
  int i = refVal;     // ok: initializes i from the value in the object to which
              // refVal is bound
               // i.e., initializes i to the same value as ival


  Reference to const(待续。。。)
  

### 非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、付费专栏及课程。

余额充值