码迷,mamicode.com
首页 > 编程语言 > 详细

C++学习之路: 左值&右值 的讨论

时间:2014-10-09 18:17:27      阅读:175      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   io   os   ar   sp   div   on   

本章我们讨论一下左值和右值, 剔除我们在学习C语言时养成一些错误常识。

 

先上代码

 1 #include <iostream>
 2 #include <string>
 3 using namespace std;
 4 
 5 
 6 //在c++98中,变量分为左值和右值,左值指的是可以取地址的变量,右值指的是非左值。二者的根本区别在于能否获取内存地址,能否赋值不是区分的依据。
 7 
 8 //根据这个原则 我们尝试给以下2个变量和2个表达式 取地址
 9 string one("one");    //  可取地址  显然这是一个左值
10 const string two("two");//可取地址 显然也是一个左值
11 string three() { return "three"; } //这个表达式返回值是string, 返回值是一个零时变量,不可取地址, 所以是右值
12 const string four() { return "four"; } //同3 
13 
14 void test(const string &s)
15 {
16     cout << "test(const string &s):" << s << endl;
17 }
18 
19 void test(string &s)
20 {
21     cout << "test(string &s):" << s << endl;
22 }
23 
24 
25 int main(int argc, char const *argv[])
26 {
27     
28 
29     test(one);
30     test(two);
31     test(three());
32     test(four());
33 
34 
35     return 0;
36 }
1 //打印结果
2 test(string &s):one
3 test(const string &s):two
4 test(const string &s):three
5 test(const string &s):four

 

从打印结果来看, 函数重载上, 输入参数为非const 形式时(包含修改语义), 对于右值(常量或者零时变量)含有修改语义的函数, 是不可接受右值的。

                课堂总结:

10.在c++98中,变量分为左值和右值,左值指的是可以取地址的变量,右值指的是非左值。二者的根本区别在于能否获取内存地址,能否赋值不是区分的依据。
11.四个变量或者表达式
a)string one("foo");
b)const string two("bar");
c)string three() { return "three"; }
d)const string four() { return "four"; }
e)前两个为左值,后二者为右值
12.C++98中的引用分为两种“const引用”和“非const引用”,其中const引用,可以引用所有的变量。而后者只能引用非const左值,即one。
13.如果同时提供const引用和非const引用版本的重载,那么one会优先选择更加符合自身的非const引用。其他三个变量只能选择const引用。
14.上面反应了C++重载决议的一个特点:参数在通用参数和更加符合自身的参数之间,优先选择后者
 
 
 
 
在C++11中,对类型进行了更加细化的分类。  我们把上例的4个类型进行重新划分
                                        const                            non-const
lvalue                  two                                  one
 
rvalue                 three()                            four()
 
 
 
所以: one 是 非常量-左值, two是 常量-左值  ,three是 常量-右值, four是 非常量-右值;
 对应:              T &                             const T &              const T &&                    T &&
 
     
 
 
 
 
 

C++学习之路: 左值&右值 的讨论

标签:style   blog   color   io   os   ar   sp   div   on   

原文地址:http://www.cnblogs.com/DLzhang/p/4013691.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!