查看原文
其他

C++ 面试被问到的“左值引用和右值引用”

字节流动 2022-09-25

1.左值和右值

在C++11中可以取地址的、有名字的就是左值,反之,不能取地址的、没有名字的就是右值(将亡值或纯右值)。

举个例子,int a = b+c, a 就是左值,其有变量名为a,通过&a可以获取该变量的地址;表达式b+c、函数int func()的返回值是右值,在其被赋值给某一变量前,我们不能通过变量名找到它,&(b+c)这样的操作则不会通过编译。

左值是可以放在赋值号左边可以被赋值的值;左值必须要在内存中有实体;

右值当在赋值号右边取出值赋给其他变量的值;右值可以在内存也可以在CPU寄存器。

一个对象被用作右值时,使用的是它的内容(值),被当作左值时,使用的是它的地址。

2.左值引用

左值引用就是我们平常使用的“引用”。引用是为对象起的别名,必须被初始化,与变量绑定到一起,且将一直绑定在一起。

我们通过 & 来获得左值引用,  
type &引用名 = 左值表达式; 
可以把引用绑定到一个左值上,而不能绑定到要求转换的表达式、字面常量或是返回右值的表达式。举个例子:

int i = 42;
int &r = i;    //正确,左值引用
int &r1 = i * 42;   //错误, i*42是一个右值
const int &r2 = i * 42//正确,可以将一个const的引用绑定到一个右值上

3.右值引用

右值引用是C++11中引入的新特性 , 它实现了转移语义和精确传递

它的主要目的有两个方面:

  1. 消除两个对象交互时不必要的对象拷贝,节省运算存储资源,提高效率。

  2. 能够更简洁明确地定义泛型函数。

右值引用就是必须绑定到右值的引用,他有着与左值引用完全相反的绑定特性,我们通过 && 来获得右值引用。

右值引用的基本语法type &&引用名 = 右值表达式;

右值有一个重要的性质——只能绑定到一个将要销毁的对象上。举个例子:

int  &&rr = i;  //错误,i是一个变量,变量都是左值
int &&rr1 = i *42;  //正确,i*42是一个右值

4、右值引用和左值引用的区别

  1. 左值可以寻址,而右值不可以。

  2. 左值可以被赋值,右值不可以被赋值,可以用来给左值赋值。

  3. 左值可变,右值不可变(仅对基础类型适用,用户自定义类型右值引用可以通过成员函数改变)。

原文链接: https://blog.csdn.net/qq_41181857/article/details/107581632


推荐:

面试常问的 C/C++ 问题,你能答上来几个?

C++ 面试必问:深入理解虚函数表

很多人搞不清 C++ 中的 delete 和 delete[ ] 的区别

看懂别人的代码,总得懂点 C++ lambda 表达式吧

Java、C++ 内存模型都不知道,还敢说自己是高级工程师?

C++ std::thread 必须要熟悉的几个知识点

现代 C++ 并发编程基础

现代 C++ 智能指针使用入门

c++ thread join 和 detach 到底有什么区别?

C++ 面试八股文:list、vector、deque 比较

C++经典面试题(最全,面中率最高)

C++ STL deque 容器底层实现原理(深度剖析)

STL vector push_back 和 emplace_back 区别

了解 C++ 多态与虚函数表

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存