目录
前言说明:
最近修改时间:2022年11月3日22:52:13
作者:黎雪途
1、左值和右值的概念
左值是可以放在赋值号左边可以被赋值的值;左值必须要在内存中有实体;
右值当在赋值号右边取出值赋给其他变量的值;右值可以在内存也可以在CPU寄存器。【右值可以理解为临时变量】
一个对象被用作右值时,使用的是它的内容(值),被当作左值时,使用的是它的地址。
2、引用
引用是C++语法做的优化,引用的本质还是靠指针来实现的。引用相当于变量的别名。
引用可以改变指针的指向,还可以改变指针所指向的值。
引用的基本规则:
- 声明引用的时候必须初始化,且一旦绑定,不可把引用绑定到其他对象;即引用必须初始化,不能对引用重定义;
- 对引用的一切操作,就相当于对原对象的操作。
3、左值引用和右值引用
3.1 左值引用
左值引用的基本语法:type &引用名 = 左值表达式;
3.2 右值引用
右值引用的基本语法type &&引用名 = 右值表达式;
右值引用在企业开发人员在代码优化方面会经常用到。
右值引用的“&&”中间不可以有空格。
左值
一个表示数据的表达式,左值是一个可以&取地址的量
Int a = 10;
&a;
左值阴影要求右边的值必须可以获取地址,如果无法获取地址,可以使用常引用
使用const常引用之后,我们只能通过引用来获取数据,无法修改数据
右值(作用是实现移动语义和完美转发)
右值包括字面常量,不是左值的量就是右值
右值符号:&&
不是左值:x+y
移动语义
// C++中还有一个被广泛认同的说法,那就是可以取地址的、有名字的就是左值,反之,不能取地址的、没有名字的就是右值。
// 相对于左值,右值表示字面常量、表达式、函数的非引用返回值等。
/*
右值引用是用来支持转移语义的。
转移语义可以将资源 ( 堆,系统对象等 ) 从一个对象转移到另一个对象,这样能够减少不必要的临时对象的创建、拷贝以及销毁,能够大幅度提高 C++ 应用程序的性能。临时对象的维护 ( 创建和销毁 ) 对性能有严重影响。
转移语义是和拷贝语义相对的,可以类比文件的剪切与拷贝,当我们将文件从一个目录拷贝到另一个目录时,速度比剪切慢很多。
通过转移语义,临时对象中的资源能够转移其它的对象里。
移动语义定义:
在现有的 C++ 机制中,我们可以定义拷贝构造函数和赋值函数。
要实现转移语义,需要定义转移构造函数,还可以定义转移赋值操作符。
对于右值的拷贝和赋值会调用转移构造函数和转移赋值操作符。
如果转移构造函数和转移拷贝操作符没有定义,那么就遵循现有的机制,拷贝构造函数和赋值操作符会被调用。
普通的函数和操作符也可以利用右值引用操作符实现转移语义。
强制移动:move()
通常移动构造函数和移动运算符使用右值,但一定要他们使用左值的时候,使用move()
C++中特殊的成员函数
默认构造函数
拷贝构造函数
拷贝赋值函数
移动构造函数
移动复制函数
析构函数