c++左值和右值
c++编程中如果出现把一个函数的返回值、强行转化后的对象 作为函数的参数传进去时,编译器会报错的情况。这时候就该注意了,你需要把该函数的参数类型前加上const修饰。
原因在于c++的左值和右值有所区别:
c++中每一个表达式都会产生一个左值和右值。比如a=3。a就是一个左值,3就是一个右值。左值可以作为右值,但右值不能作为左值。比如:3=b;就不是正确的。
那么怎么分辨左值和右值呢?
一般来说,左值的地址对程序员是开放的,比如定义的变量或对象我们可以用 &加变量名或对象名 将它的地址取出来。
但是一个右值 比如存放函数返回值的临时变量、被强制类型转换的对象(也会产生一个临时对象,注意是自定义类型不是基本类型,基本类型的右值不能被const或volatile修饰,也不能被修改),
我们不知道它具体叫什么名字,所以它的地址对程序员是不开放的,那么他就是一个右值。
对于右值来说有这样两点需要注意:
1.(自定义类型的)右值可以使用他的成员函数改变自己的数据成员。
2.(自定义类型的)右值只能被const类型的引用所引用,所以说传进右值的函数的形参要声明为const的,不然编译会出错。
不过这种东西还真是不方便呢,不过如果不嫌麻烦,可以再创建一个和临时对象类型一致的对象把临时对象接过来,使用新的左值就可以正常调用函数了,当然你把函数的形参类型声明为const也是极好的。
c++左值和右值的更多相关文章
- c++ 左值 和 右值
什么是lvalue, 什么是rvalue? lvalue: 具有存储性质的对象,即lvalue对象,是指要实际占用内存空间.有内存地址的那些实体对象,例如:变量(variables).函数.函数指针等 ...
- C++中的左值与右值(二)
以前以为自己把左值和右值已经弄清楚了,果然发现自己还是太年轻了,下面的这些东西是自己通过在网上拾人牙慧,加上自己的理解写的. 1. 2. 怎么区分左值和右值:知乎大神@顾露的回答. 3. 我们不能直接 ...
- C++中的左值和右值
左值和右值的定义 在C++中,能够放到赋值操作符=左边的是左值,能够放到赋值操作符右边的是右值.有些变量既能够当左值又能够当右值.进一步来讲,左值为Lvalue,事实上L代表Location,表示在内 ...
- C++11 左值与右值
概念 左值:表达式结束后依然存在的对象 右值:表达式结束后就不存在的临时对象 2.如何判断左值和右值 能不能对表达式取地址,如果能,就是左值,否则就是右值 3.对下面的语句进行区分 int a = 3 ...
- c++ 11 移动语义、std::move 左值、右值、将亡值、纯右值、右值引用
为什么要用移动语义 先看看下面的代码 // rvalue_reference.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #includ ...
- C++ 11 左值,右值,左值引用,右值引用,std::move, std::foward
这篇文章要介绍的内容和标题一致,关于C++ 11中的这几个特性网上介绍的文章很多,看了一些之后想把几个比较关键的点总结记录一下,文章比较长.给出了很多代码示例,都是编译运行测试过的,希望能用这些帮助理 ...
- C++11 左值、右值、右值引用详解
C++11 左值.右值.右值引用详解 左值.右值 在C++11中所有的值必属于左值.右值两者之一,右值又可以细分为纯右值.将亡值. 在C++11中可以取地址的.有名字的就是左值,反之,不能取地址的.没 ...
- C++11 左值、右值、右值引用
左值.右值 在C++11中所有的值必属于左值.右值两者之一,右值又可以细分为纯右值.将亡值.在C++11中可以取地址的.有名字的就是左值,反之,不能取地址的.没有名字的就是右值(将亡值或纯右值).举个 ...
- C++ 左值与右值 右值引用 引用折叠 => 完美转发
左值与右值 什么是左值?什么是右值? 在C++里没有明确定义.看了几个版本,有名字的是左值,没名字的是右值.能被&取地址的是左值,不能被&取地址的是右值.而且左值与右值可以发生转换. ...
随机推荐
- nginx----------------环境搭建遇到的一些问题汇总--(多域名配置,配置文件修改问题)
nginx的启动命令是:(通用) /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf 重启命令: /usr/local/ng ...
- 亿级Web系统搭建——单机到分布式集群
当一个Web系统从日访问量10万逐步增长到1000万,甚至超过1亿的过程中,Web系统承受的压力会越来越大,在这个过程中,我们会遇到很多的问题.为了解决这些性能压力带来问题,我们需要在Web系统架构层 ...
- Spring的Ioc和AOP扩展
多种方式实现依赖注入: 这里唯一需要说明的是如果要使用P命名空间实现属性注入,需要添加命名空间的声明: 如我的xml里红色字体: <?xml version="1.0" en ...
- 简单封装数据请求(iOS)
#import <Foundation/Foundation.h> //给block起 别名 //类型 void(^)(BOOL success , id data) //别名是 Comp ...
- .net常见的面试题
1,asp.net中的页生命周期 答:msdn官网已给出标准答案,这里简述一下:页要经历下表概述的8个阶段.除了页生命周期阶段以外,在请求前后还存在应用程序阶段,但是这些阶段并不特定于页. 而这8个阶 ...
- linux shell脚本使用结构化命令(2)
一.for命令 二.while命令 三.until命令 1.for命令基本格式 for var in list do commands done oracle@suse:~/testshell> ...
- TurboDemo软件使用教程:视频编辑
视频软件TurboDemo中不仅可以快速的捕捉屏幕,而且可以对视频进行编辑,本文来详细的了解一下这个步骤. 当你完整屏幕捕捉和录制后,点击系统托盘上的箭头或点击键盘上的“print screen”键之 ...
- Lucene热词显示并选择
利用Jquery easyui里的autocomplete(1.10.0版本) 的异步请求(remot.html) 添加引用 <script src="~/Scripts/jquery ...
- Hello Spring Framework——源(Resources)
本文介绍Spring框架如何解析外部资源文件,仅参考官方文档<第7章 Resources>. ***************************以下是正文的部分************ ...
- JVM之几种垃圾收集器简单介绍
本文中的垃圾收集器研究背景为:HotSpot+JDK1.7 一.垃圾收集器概述 如上图所示,垃圾回收算法一共有7个,3个属于年轻代.三个属于年老代,G1属于横跨年轻代和年老代的算法. JVM会从年轻代 ...