/*
* 理解左值和右值
*
*
* 为什么要关心这个?
* 1. 有助于理解C++结构,搞明白编译器的错误和警告
* 2. C++ 11中引入了右值引用,理解左值右值是前提
*
*/ /*
* 简单的定义:
*
* 左值 - 在内存中具有可标识位置的对象
* 右值 - 任何不是左值的对象
*/ //左值的例子:
int i; // i是左值
int* p = &i; // i的地址是可标识的
i = 2; // 内存的内容改变 class dog;
dog d1; // 用户定义类型的左值
// C++代码中大多数变量是左值 //右值的例子:
int x = 2; // 2是右值
int x = i+2; // (i+2)是右值
int* p = &(i+2); // Error,地址不可标识
i+2 = 4; // Error 地址不可标识
2 = i; // Error dog d1;
d1 = dog(); // dog()是用户定义类型的右值 int sum(int x, int y) { return x+y; }
int i = sum(3, 4); // sum(3, 4) 是右值 //右值: 2, i+2, dog(), sum(3,4), x+y
//左值: x, i, d1, p //引用 (或者说左值引用):
int i;
int& r = i; int& r = 5; // Error,引用不能赋值为左值,需要可标识的地址 //例外:常量左值引用可以赋值为右值
const int& r = 5; // // 函数中的例子
int square(int& x) { return x*x; }
square(i); // OK
square(40); // Error //解决方法:
int square(const int& x) { return x*x; } // square(40) and square(i) work /*
* 左值可以用来生成右值
*/
int i = 1;
int x = i + 2; int x = i; /*
* 右值可以用来生成左值
*/
int v[3];
*(v+2) = 4; /*
* 误解1:函数或运算符总是产生右值
*/
int x = i + 3;
int y = sum(3,4); int myglobal ;
int& foo() {
return myglobal;
}
foo() = 50; // 更常见的例子:
array[3] = 50; // 操作符[] 几乎总是返回左值 /*
* 误解2:左值都是可以修改的
*
*/
const int c = 1; // c是左值
c = 2; // Error, 但是c不能被修改 /*
* 误解3:右值不能被修改
*/
i + 3 = 6; // Error,内置类型的确不行
sum(3,4) = 7; // Error // 对于用户定义类型不成立
class dog;
dog().bark(); // dog()是右值,bark() 可能修改dog对象的状态 /*
* 总结
*
* 1. 每个C++表达式生成一个左值或右值
* 2. 如果表达式有一个可以标识的内存地址,则它是左值;否则,是右值
*/

C++进阶--理解左值和右值的更多相关文章

  1. c++中的左值和右值的理解

    1.左值和右值的概念 C++中左值(lvalue)和右值(rvalue)是比较基础的概念,虽然平常几乎用不到,但C++11之后变得十分重要,它是理解 move/forward 等新语义的基础. 左值与 ...

  2. c++ 左值 和 右值

    什么是lvalue, 什么是rvalue? lvalue: 具有存储性质的对象,即lvalue对象,是指要实际占用内存空间.有内存地址的那些实体对象,例如:变量(variables).函数.函数指针等 ...

  3. C++中的左值与右值(二)

    以前以为自己把左值和右值已经弄清楚了,果然发现自己还是太年轻了,下面的这些东西是自己通过在网上拾人牙慧,加上自己的理解写的. 1. 2. 怎么区分左值和右值:知乎大神@顾露的回答. 3. 我们不能直接 ...

  4. C++ 11 左值,右值,左值引用,右值引用,std::move, std::foward

    这篇文章要介绍的内容和标题一致,关于C++ 11中的这几个特性网上介绍的文章很多,看了一些之后想把几个比较关键的点总结记录一下,文章比较长.给出了很多代码示例,都是编译运行测试过的,希望能用这些帮助理 ...

  5. C++11 左值、右值、右值引用详解

    C++11 左值.右值.右值引用详解 左值.右值 在C++11中所有的值必属于左值.右值两者之一,右值又可以细分为纯右值.将亡值. 在C++11中可以取地址的.有名字的就是左值,反之,不能取地址的.没 ...

  6. C++11 左值、右值、右值引用

    左值.右值 在C++11中所有的值必属于左值.右值两者之一,右值又可以细分为纯右值.将亡值.在C++11中可以取地址的.有名字的就是左值,反之,不能取地址的.没有名字的就是右值(将亡值或纯右值).举个 ...

  7. C++ 左值与右值 右值引用 引用折叠 => 完美转发

    左值与右值 什么是左值?什么是右值? 在C++里没有明确定义.看了几个版本,有名字的是左值,没名字的是右值.能被&取地址的是左值,不能被&取地址的是右值.而且左值与右值可以发生转换. ...

  8. c++中的左值与右值

    左值(lvalue)和右值(rvalue)是 c/c++ 中一个比较晦涩基础的概念,不少写了很久c/c++的人甚至没有听过这个名字,但这个概念到了 c++11 后却变得十分重要,它们是理解 move/ ...

  9. 关于i++和i++的左值、右值问题

    1.什么是左值和右值? 左值就是出现在表达式左边的值(等号左边),可以被改变,他是存储数据值的那块内存的地址,也称为变量的地址: 右值是指存储在某内存地址中的数据,也称为变量的数据. 左值可以作为右值 ...

随机推荐

  1. SQL Server导入导出表及备份恢复

    1.   导出: 2.   导入

  2. LOJ 6277:数列分块入门 1(分块入门)

    #6277. 数列分块入门 1 内存限制:256 MiB时间限制:100 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计讨论 3 测试数据 题目描述 给出一 ...

  3. Windows 清理磁盘

    ====手动清理C盘(开始\运行\cleanmgr,选择C盘...)或者如下右键C盘,选择属性,点击通用页签下方[磁盘清理]按钮.磁盘清理界面,中间部分可以选择要清理的项目,可以全选.然后点击下方的清 ...

  4. 自我复制的3D打印机

    RepRap 是人类历史上第一部可以自我复制型的机器. https://reprap.org/wiki/RepRap RepRap 是一部可以生成塑料实物的免费桌面型 3D 打印机.由于 RepRap ...

  5. PyCharm下载安装

    PyCharm 是一款功能强大的 Python 编辑器,具有跨平台性,鉴于目前最新版 PyCharm 使用教程较少,为了节约时间,来介绍一下 PyCharm 在 Windows下是如何安装的. 这是 ...

  6. 使用mongoose连接mongodb(转载文章)

    mongodb数据库 MongoDB是一个高效的基于分布式文件存储的数据库,将数据存储为一个文档,数据结构由键值(key=>value)对组成.MongoDB 文档类似于 JSON 对象.字段值 ...

  7. pushpin 将web services 转换为realtime api 的反向代理工具

    pushpin 是一款反向代理工具,可以将web services 转换为实时的api 参考架构图 包含的特性 透明 无状态 共享nothing 发布&&订阅模型 几种灵活用法 基本使 ...

  8. Why service collaboration needs choreography AND orchestration

    转自:https://blog.bernd-ruecker.com/why-service-collaboration-needs-choreography-and-orchestration-239 ...

  9. MATLAB中多个一维数组的合并

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/u013538664/article/details/37673711 1.一维数组直接合并      ...

  10. Java面向对象 第1节 类和对象

    一.Java 对象和类 面向对象语言三大特性:封装.继承.多态: 对象:描述客观事物的一个实体: 类:类是封装对象的属性和方法的载体,反过来说具有相同属性和行为的一类实体被称为类:类行为:方法:属性: ...