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.什么是左值和右值? 左值就是出现在表达式左边的值(等号左边),可以被改变,他是存储数据值的那块内存的地址,也称为变量的地址: 右值是指存储在某内存地址中的数据,也称为变量的数据. 左值可以作为右值 ...
随机推荐
- [LeetCode&Python] Problem 598. Range Addition II
Given an m * n matrix M initialized with all 0's and several update operations. Operations are repre ...
- CodeForces - 1099F:Cookies (线段树)
Mitya and Vasya are playing an interesting game. They have a rooted tree with n vertices, and the ve ...
- hdoj-1068(二分图的最小点覆盖)
题目 1 问题转化: 求二分图最小点覆盖(覆盖所有的边) 2 问题的解决: 二分图最小点覆盖==其最大匹配数 3 证明: 链接 =#include <bits/stdc++.h> ...
- MergeKLists
public ListNode mergeKLists(ListNode[] lists) { if(lists==null||lists.length==0) return null; Priori ...
- Blender 插件整理
系统自带插件列表: 好用的第三方插件: Align Vertices to Grease Pencil, 对齐顶点到蜡笔, https://blenderartists.org/t/addon-a ...
- Go Example--for循环
package main import "fmt" func main() { i := 1 //Go循环只有for, 第一种循环方式 for i<=3 { fmt.Prin ...
- Android USB Host框架
Android 下的usb框架及功能点:https://blog.csdn.net/tianruxishui/article/details/379029591.Android framework中* ...
- 05typedef struct用法详解与小结
1.基本解释 typedef为C语言的关键字,作用是为一种数据类型定义一个新名字,这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等). 在编程中使用typedef ...
- KMPlayer速度步进设置及快捷键设置和同级视频自动加入播放列表
速度步进设置 快捷键设置 同级视频自动加入播放列表
- React V16.x 生命周期调整
旧声明周期: table th:nth-of-type(5) { width: 400px; } 生命周期 属于阶段 调用次数 是否可以setState 作用 getDefaultProps 创建阶段 ...