一.左值与右值
1.概念
左值顾名思义是在表达式左边的值如:a = b + c,a就是表达式中的左值,左值可以被修改(前提没有被const修饰),有固定地址可以被访问。通俗来讲左值表常态,右值表临时。右值就是表达式 a = b + c 中的 b+c,就是表达式右边的值没有固定地址,就是临时对象(使用完系统自动销毁) ,也不可以被修改(总不能写成 b + c = 2)。
2.左值引用
左值引用也就是传统的C++引用,通过&符号来声明,它可以使得标识符关联到左值。引用是已定义变量的别名,例如下面将b作为a变量的别名,b和a指向相同的值和内存单元。
int a = 1;
int& b = a;
引用必须在创建时就要进行初始化,一旦与某个变量关联起来,就将一直相关联,不会中途关联到其他变量
3.右值引用
在C++11引入了右值引用(rvalue reference)的概念,通过&&符号来声明,右值引用可以关联到右值。
int && a = 1;
cout << "a = " << a << ", " << &a<< endl;
引入右值的目的之一实现移动语义
移动语义是一种优化技术,它允在对象之间转移资源的所有权,而不是进行资源的复制或者拷贝。移动语义这种技术正是通过使用右值引用来实现的。
例:假如你拜张三丰为师,你要向他学习武功,从他那里慢慢学肯定是没有直接吸收他的功力效果快。c++11之前当调用拷贝构造函数或赋值运算符时会对对象进行拷贝操作,也就是会申请一块新的内存空间,然后把数据复制到新的内存空间当中,但是这对于大型对象来说工作量是很大的,当然在一些情况下这是必要的操作,但是在某些场景下,可能其实不用额外拷贝一份,只需要将对象的资源所有权从一个对象转移到另一个对象就可以满足要求了
/*************************************************************************
> File Name: ref.cpp
> Author:
> Mail:
> Created Time: Thu Aug 15 11:25:30 2024
************************************************************************/
#include <iostream>
#include <utility>
using namespace std;
class test1 {
public:
test1(int x) : x(x) { // 初始化列表
cout << this << "构造函数" << endl;
} // 构造函数
test1(const test1& t) {
cout << this <<"拷贝构造函数" << endl;
} // 拷贝构造函数
test1(test1&& t) {
cout << this << "移动拷贝构造函数" << endl;
} // 移动拷贝构造函数
~test1() {
cout << this << "析构函数" << endl;
} // 析构函数
private:
int x;
};
int main() {
//int &&a = 1;
//cout << a << endl << &a << endl;
test1 *a = new test1(100);
test1 *b = new test1(*a);
test1 c(100);
test1 d = move(c);
delete a; // new申请的内容必须delete
delete b;
return 0;
}