Fork me on Github Fork me on Gitee

C++温故补缺(一):引用类型

引用类型

c++增加引用类型的概念,定义方法int &b=a;表示引用类型,引用类型相当于变量的别名,地位和被引用的变量相同,int &b=a;,执行后,变量a和b有相同的值和地址,相当于一个地址的内容有两个标签

必须在定义时用,如果在定义后,int b;&b=a就不是引用了,而是取地址

类似于指针的定义和取内容,int *p;定义指针,*p取指针p的内容

C++引用和指针

  • 不存在空引用。引用必须连接到一块合法的内存。
  • 一旦引用被初始化为一个对象,就不能被指向到另一个对象。指针可以在任何时候指向到另一个对象。
  • 引用必须在创建时被初始化。指针可以在任何时间被初始化。

左值、右值与引用

参考:C语言中文网.

C++的左值和右值是从C语言继承过来的,左值的英文简写是"lvalue",右值是"rvalue"。但是他们并不是"left"和"right"。左值的本意是"loactor value",即"可定位的值",也就是存储在内存中、有明确的存储地址的数据,或者说可寻址的数据。而右值"read value",指仅提供数值的数据,不一定可以寻址,如存储在寄存器中的数据。

通常,简单区分左值右值就看赋值号(=)的左右侧,能放在左侧的就是左值,能放在右侧的是右值。所以就有既能做左值又能做右值的。

如:

int a=1;
int b=a;

变量a仅能放在左边,也能放右边,而数值1只能放右边,就是右值。

另外一个例子:const修饰的类型不能再修改值,本质就是不能做左值了。

右值引用[C++ 11新增]

在C++98/03中,就有引用,用‘&’表示,但是不能对数值引用只能引用定义好的变量。

int a=10;
int &b=a;
//int &c=10;  不能这么用

但是可以给常量左值引用赋数值

const int &a=10;

因为const关键字把locator value变成read value,所以可以将数值赋给常量左值引用

C++ 11中添加新的引用方式:右值引用,用“&&”表示

右值引用也必须定义时初始化,但右值引用初始化不能是左值,只能是右值。

int &&a=10;
//int b=1; int &&a=b;  是不行的

右值引用,用别名更容易理解,int &&a=10;,是给数值10起个别名叫做a。而且,a的值是可以修改的。

意义:主要用于移动构造函数,避免不必要的深拷贝,提高程序运行效率。

posted @ 2023-03-20 23:17  Tenerome  阅读(43)  评论(0编辑  收藏  举报