引用类型
定义
C++中的引用类型是一种符合类型,本质上是对另一个变量的别名。使用引用可以让我们直接访问和操作另一个变量的内存地址,不需要通过指针的解引用操作,引种在语法上比指针更简洁,且在许多情况下更安全。
引用写法演示
先看下面的代码:
1 | int a = 10; |
·我们定义了a,并为他开辟空间,存储10。
·我们又定义了b,可以说b是a的别名,所以b的地址和a的地址一致。
·其中a和b指向同一块内存空间。
1 | std::cout << "a的地址为" << &a << std::endl; |
可以发现a和b打印的地址是相同的。
这就是说:
修改a的值,b的值也跟着修改;
修改b的值,a的值也跟着修改;
特性
1.必须初始化:引用在创建的时候必须被初始化,它必须指向某个已存在的对象。
就上面的例子说,a是大名,b是小名,两者指的都是同一个人,但是必须有大名才能有小名
2.一旦绑定,不可修改:引用一旦被初始化,将一直保持与其初始化对象的绑定,不能改变为另一个对象的引用。
3.没有空引用:引用必须指向某个变量,不能存在空引用。
注意事项
·引用主要用于函数参数和返回值,以及类的成员变量,提供对原始数据的直接访问。
·引用在内部实现上是通过指针来实现的。
左值引用和右值引用
左值(lvalue)和右值(rvalue) 是表达式的两种基本分类,决定了表达式的结果在内存中的位置和状态。
左值通常指的是具有持久状态的对象,有明确的内存地址,可以被多次赋值。
右值通常指的是临时的,没有持久状态的值,通常没有内存地址或者其内存地址在表达式结束之后就变得无效。
左值:可以被修改的值
右值:不可被修改的值,比如函数返回值,字面量等
左值引用
左值引用是C++ 98 就有的特性,就是我们上面通俗说的引用。
1 | int m = 10; //可以被修改,所以m是左值 |
右值引用
右值引用是C++ 11 新增的特性,它允许我们为右值(临时对象或者即将被销毁的对象)创建一个引用。
1 | int && m_r2 = 10; //10为字面量,所以这是右值引用 |
总结
·左值引用是C++ 98 就有的特性,用于已存在的对象创建别名。
·右值引用是C++ 11 的新特性,用于为右值(即临时对象)创建引用,支持移动语义和完美转发等高级特性。
·右值引用的主要用途不是直接绑定到字面量或简单的右值表达式上,而是在函数参数和返回值中,以更高级的资源管理和更灵活的代码编写方式。