C++进阶--理解左值和右值
/*
* 理解左值和右值
*
*
* 为什么要关心这个?
* 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++进阶--理解左值和右值的更多相关文章
- c++中的左值和右值的理解
1.左值和右值的概念 C++中左值(lvalue)和右值(rvalue)是比较基础的概念,虽然平常几乎用不到,但C++11之后变得十分重要,它是理解 move/forward 等新语义的基础. 左值与 ...
- c++ 左值 和 右值
什么是lvalue, 什么是rvalue? lvalue: 具有存储性质的对象,即lvalue对象,是指要实际占用内存空间.有内存地址的那些实体对象,例如:变量(variables).函数.函数指针等 ...
- C++中的左值与右值(二)
以前以为自己把左值和右值已经弄清楚了,果然发现自己还是太年轻了,下面的这些东西是自己通过在网上拾人牙慧,加上自己的理解写的. 1. 2. 怎么区分左值和右值:知乎大神@顾露的回答. 3. 我们不能直接 ...
- C++ 11 左值,右值,左值引用,右值引用,std::move, std::foward
这篇文章要介绍的内容和标题一致,关于C++ 11中的这几个特性网上介绍的文章很多,看了一些之后想把几个比较关键的点总结记录一下,文章比较长.给出了很多代码示例,都是编译运行测试过的,希望能用这些帮助理 ...
- C++11 左值、右值、右值引用详解
C++11 左值.右值.右值引用详解 左值.右值 在C++11中所有的值必属于左值.右值两者之一,右值又可以细分为纯右值.将亡值. 在C++11中可以取地址的.有名字的就是左值,反之,不能取地址的.没 ...
- C++11 左值、右值、右值引用
左值.右值 在C++11中所有的值必属于左值.右值两者之一,右值又可以细分为纯右值.将亡值.在C++11中可以取地址的.有名字的就是左值,反之,不能取地址的.没有名字的就是右值(将亡值或纯右值).举个 ...
- C++ 左值与右值 右值引用 引用折叠 => 完美转发
左值与右值 什么是左值?什么是右值? 在C++里没有明确定义.看了几个版本,有名字的是左值,没名字的是右值.能被&取地址的是左值,不能被&取地址的是右值.而且左值与右值可以发生转换. ...
- c++中的左值与右值
左值(lvalue)和右值(rvalue)是 c/c++ 中一个比较晦涩基础的概念,不少写了很久c/c++的人甚至没有听过这个名字,但这个概念到了 c++11 后却变得十分重要,它们是理解 move/ ...
- 关于i++和i++的左值、右值问题
1.什么是左值和右值? 左值就是出现在表达式左边的值(等号左边),可以被改变,他是存储数据值的那块内存的地址,也称为变量的地址: 右值是指存储在某内存地址中的数据,也称为变量的数据. 左值可以作为右值 ...
随机推荐
- 【集成学习】sklearn中xgboost模块的XGBClassifier函数
# 常规参数 booster gbtree 树模型做为基分类器(默认) gbliner 线性模型做为基分类器 silent silent=0时,不输出中间过程(默认) silent=1时,输出中间过程 ...
- JavaBasic_03
变量 变量定义的格式: 数据类型 变量名 = 初始化值; 可以在一行中定义多个变量(在实际开发中不推荐,推荐一行定义一个变量)数据类型 变量名1=初始化值,变量名,...,变量名n // ...
- POJ 2751:Seek the Name, Seek the Fame(Hash)
Seek the Name, Seek the Fame Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 24077 Ac ...
- HDU 2023 求平均成绩
Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status Practice HDU ...
- eclipse打jar包解决第三方依赖包
在项目根目录下手动MANIFEST.MF(eclipse无法自动生成) MANIFEST.MF Manifest-Version: 1.0 Class-Path: lib/kafka-clients- ...
- C++学习(十四)(C语言部分)之 数组
上期回顾:三大循环 for while do while (循环体至少会执行一次)四大跳转 goto continue(提前跳出当前循环 进入下一个循环) break(跳出本次循环) return(跳 ...
- MySQL Binlog--MIXED模式下数据更新
在 Mixed 模式下,MySQL 会根据执行的每一条具体的 SQL 语句来区分对待记录的日志形式,也就是在 statement 和 row 之间选择一种.如果SQL语句为UPDATE/DELETE等 ...
- mysqldump命令之常用模板
##=====================================================## ## 在Master上导出所有数据库 /export/servers/mysql/b ...
- Cassandra--启用用户认证和用户管理
======================================================== 启用用户认证和创建超级用户 需要针对每个节点进行配置修改和重启,但授权操作仅需要在任一 ...
- Centos系统下Docker的安装
一.检查内核版本 安装Docker,需要linux内核大于3.10 使用uname -r 来检查 二. Centos系统下Docker的安装 1. 安装需要的软件包 yum install -y yu ...