面试题:左值和右值?
在C++中,左值(left value)和右值(right value)是常用的概念。简单来说,在表达式中可以出现在赋值号“=”左边的对象称为左值,而只能出现在“=”右边的对象则被称为右值。
左值
左值代表一个具有相对固定的内存地址的对象,它通常对应于具体的变量、数组元素或对象的属性等。左值在内存中通常有一块对应的内存空间,可以进行读取和写入操作。
例如,在下面的代码中,a、array[0]和obj.name都是左值:
int a; int array[5]; struct MyStruct { int age; char name[20]; }; MyStruct obj; a = 10; // 对左值进行赋值操作 array[0] = 3; obj.age = 20;
右值
与左值不同,右值代表的是某个数值、表达式计算结果或临时对象的值,它通常是由常量或表达式生成的。右值不能直接进行数据修改操作,因为它们往往并没有实际地址或者地址不可被修改。
例如,在下面的代码中,1+2、fun()和"Hello"都是右值:
a = 1 + 2; // 将右值赋给左值 b = fun(); cout << "Hello, World!" << endl;
左值引用和右值引用
在C++11中,我们引入了左值引用(lvalue reference)和右值引用(rvalue reference)来进一步扩充左值和右值的概念,并提高程序的性能。
左值引用指向一个左值对象,而右值引用则只能绑定到一个右值上。右值引用通常用于移动语义和完美转发等场合,在函数返回值、std::move等函数中会经常用到。
例如,有如下代码:
int a = 0; int &ref_l = a; // 左值引用 int &&ref_r = 1; // 右值引用
其中,ref_l是一个左值引用,可以绑定到变量a上;而ref_r是一个右值引用,只能绑定到临时对象或表达式结果上。
综上所述,左值和右值是C++中常见的概念,它们分别代表了一块内存空间和一个数值或计算结果。同时,在C++11中,我们还可以使用左值引用和右值引用来进一步扩充其概念,并提高程序的性能和灵活性。