c++左值和右值
2015-12-10 13:11
211 查看
c++编程中如果出现把一个函数的返回值、强行转化后的对象 作为函数的参数传进去时,编译器会报错的情况。这时候就该注意了,你需要把该函数的参数类型前加上const修饰。
原因在于c++的左值和右值有所区别:
c++中每一个表达式都会产生一个左值和右值。比如a=3。a就是一个左值,3就是一个右值。左值可以作为右值,但右值不能作为左值。比如:3=b;就不是正确的。
那么怎么分辨左值和右值呢?
一般来说,左值的地址对程序员是开放的,比如定义的变量或对象我们可以用 &加变量名或对象名 将它的地址取出来。
但是一个右值 比如存放函数返回值的临时变量、被强制类型转换的对象(也会产生一个临时对象,注意是自定义类型不是基本类型,基本类型的右值不能被const或volatile修饰,也不能被修改),
我们不知道它具体叫什么名字,所以它的地址对程序员是不开放的,那么他就是一个右值。
对于右值来说有这样两点需要注意:
1.(自定义类型的)右值可以使用他的成员函数改变自己的数据成员。
2.(自定义类型的)右值只能被const类型的引用所引用,所以说传进右值的函数的形参要声明为const的,不然编译会出错。
不过这种东西还真是不方便呢,不过如果不嫌麻烦,可以再创建一个和临时对象类型一致的对象把临时对象接过来,使用新的左值就可以正常调用函数了,当然你把函数的形参类型声明为const也是极好的。
原因在于c++的左值和右值有所区别:
c++中每一个表达式都会产生一个左值和右值。比如a=3。a就是一个左值,3就是一个右值。左值可以作为右值,但右值不能作为左值。比如:3=b;就不是正确的。
那么怎么分辨左值和右值呢?
一般来说,左值的地址对程序员是开放的,比如定义的变量或对象我们可以用 &加变量名或对象名 将它的地址取出来。
但是一个右值 比如存放函数返回值的临时变量、被强制类型转换的对象(也会产生一个临时对象,注意是自定义类型不是基本类型,基本类型的右值不能被const或volatile修饰,也不能被修改),
我们不知道它具体叫什么名字,所以它的地址对程序员是不开放的,那么他就是一个右值。
对于右值来说有这样两点需要注意:
1.(自定义类型的)右值可以使用他的成员函数改变自己的数据成员。
2.(自定义类型的)右值只能被const类型的引用所引用,所以说传进右值的函数的形参要声明为const的,不然编译会出错。
不过这种东西还真是不方便呢,不过如果不嫌麻烦,可以再创建一个和临时对象类型一致的对象把临时对象接过来,使用新的左值就可以正常调用函数了,当然你把函数的形参类型声明为const也是极好的。
相关文章推荐
- 大话设计模式_桥接模式c++实现
- C++11 新特性 之 decltype
- 算法练习 - 字符串的全排列(字典序排列)
- 用C语言在终端打印彩色字符串
- C++ 类成员访问运算符 -> 重载
- 【C++设计技巧】C++中的RAII机制
- C语言宏定义使用技巧
- C++对象池实现
- C++ Primer高速学习 第一章 获得二:输入和输出 (IO)
- C++11的default和delete关键字
- C++使用函数模板
- [原创]C#引用C++编译的dll
- C语言中内存分配
- c++的学习经验!
- 函数指针的应用
- .net调用c++ dll
- C++ 14观察者模式
- using关键字的使用
- 如何在c语言中调用一个函数,使其运行在NSRunLoop的线程中
- effective c++ 学习笔记 1