标签: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++重载决议的一个特点:参数在通用参数和更加符合自身的参数之间,优先选择后者 |
标签:style blog color io os ar sp div on
原文地址:http://www.cnblogs.com/DLzhang/p/4013691.html