C++引用类型


引用类型

定义

C++中的引用类型是一种符合类型,本质上是对另一个变量的别名。使用引用可以让我们直接访问和操作另一个变量的内存地址,不需要通过指针的解引用操作,引种在语法上比指针更简洁,且在许多情况下更安全。

引用写法演示

先看下面的代码:

1
2
int a = 10;
int &b = a; //其中b是a的引用

·我们定义了a,并为他开辟空间,存储10。

·我们又定义了b,可以说b是a的别名,所以b的地址和a的地址一致。

·其中a和b指向同一块内存空间。

1
2
std::cout << "a的地址为" << &a << std::endl;
std::cout << "b的地址为" << &b << std::endl;

可以发现a和b打印的地址是相同的。

这就是说:

​ 修改a的值,b的值也跟着修改;

​ 修改b的值,a的值也跟着修改;

特性

​ 1.必须初始化:引用在创建的时候必须被初始化,它必须指向某个已存在的对象。

就上面的例子说,a是大名,b是小名,两者指的都是同一个人,但是必须有大名才能有小名

​ 2.一旦绑定,不可修改:引用一旦被初始化,将一直保持与其初始化对象的绑定,不能改变为另一个对象的引用。

​ 3.没有空引用:引用必须指向某个变量,不能存在空引用。

注意事项

·引用主要用于函数参数和返回值,以及类的成员变量,提供对原始数据的直接访问。

·引用在内部实现上是通过指针来实现的。

左值引用和右值引用

左值(lvalue)和右值(rvalue) 是表达式的两种基本分类,决定了表达式的结果在内存中的位置和状态。

左值通常指的是具有持久状态的对象,有明确的内存地址,可以被多次赋值。

右值通常指的是临时的,没有持久状态的值,通常没有内存地址或者其内存地址在表达式结束之后就变得无效。

左值:可以被修改的值

右值:不可被修改的值,比如函数返回值,字面量等

左值引用

左值引用是C++ 98 就有的特性,就是我们上面通俗说的引用。

1
2
int m = 10;  //可以被修改,所以m是左值
int &m_r1 = m; //绑定到左值的就是左值引用

右值引用

右值引用是C++ 11 新增的特性,它允许我们为右值(临时对象或者即将被销毁的对象)创建一个引用。

1
2
3
4
5
6
7
8
9
10
int && m_r2 = 10; //10为字面量,所以这是右值引用
int & m_r3 = 10; //错误,不能用左值引用绑定右值

//上面这种情况的右值引用知识方便理解,实际中这种情况并不常见

std::string foo(){
return std::string("hello world!");
}

std::string && d = foo(); //d是foo()返回的临时字符串的右值引用

总结

·左值引用是C++ 98 就有的特性,用于已存在的对象创建别名。

·右值引用是C++ 11 的新特性,用于为右值(即临时对象)创建引用,支持移动语义完美转发等高级特性。

·右值引用的主要用途不是直接绑定到字面量或简单的右值表达式上,而是在函数参数和返回值中,以更高级的资源管理和更灵活的代码编写方式。


文章作者: 山木
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 山木 !
  目录