const vs non-const

本文探讨了在编程中变量与函数之间的类型匹配原则,详细解释了常量和非常量变量如何与常量和非常量函数进行交互。通过实例展示了指针和对象在不同场景下的使用方式。

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

  • It is OK to pass a non-const variable to a function with const parameter; it is incorrect to pass a const variable to a function with non-const parameter.
  • non-const function can invoke const function; const function can't invoke non-const function.
  • A* const a // const pointer, non-const object; a can't point to other objects, but the object that it points can be changed.
    • A aa;
    • *a = aa; // ok because *a is non-const object.
    • a can call non-const function in class A.
    • a = &aa // error, because a is a const pointer.
  • const A* a // non-const pointer, const object; a can point to other objects, but the object that it points can't be changed.
    • A aa;
    • *a = aa; // error, because *a is a const object.
    • a can't call non-const function in class A.
    • a = &aa // ok, because a is a non-const pointer.
  • STL iterators are similar to pointer.
    • xxx::iterator is equal to T*
    • const xxx::iterator is equal to T* const
    • xxx::const_iterator is equal to const T*
### 非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、付费专栏及课程。

余额充值