C++右值引用

右值引用

目录

右值引用... 1

前言说明:... 1

左值... 1

右值... 1

移动语义... 3

强制移动:move()... 3

C++中特殊的成员函数... 3

前言说明:

最近修改时间:2022年11月3日22:52:13

作者:黎雪途

左值

一个表示数据的表达式,左值是一个可以&取地址的量

Int a = 10;

&a;

左值阴影要求右边的值必须可以获取地址,如果无法获取地址,可以使用常引用

使用const常引用之后,我们只能通过引用来获取数据,无法修改数据

右值

右值包括字面常量,不是左值的量就是右值

右值符号:&&

C++右值引用_第1张图片C++右值引用_第2张图片

C++右值引用_第3张图片C++右值引用_第4张图片

不是左值:x+y

C++右值引用_第5张图片

移动语义

// C++中还有一个被广泛认同的说法,那就是可以取地址的、有名字的就是左值,反之,不能取地址的、没有名字的就是右值。

// 相对于左值,右值表示字面常量、表达式、函数的非引用返回值等。

/*

右值引用是用来支持转移语义的。

转移语义可以将资源 ( 堆,系统对象等 ) 从一个对象转移到另一个对象,这样能够减少不必要的临时对象的创建、拷贝以及销毁,能够大幅度提高 C++ 应用程序的性能。临时对象的维护 ( 创建和销毁 ) 对性能有严重影响。

转移语义是和拷贝语义相对的,可以类比文件的剪切与拷贝,当我们将文件从一个目录拷贝到另一个目录时,速度比剪切慢很多。

通过转移语义,临时对象中的资源能够转移其它的对象里。

移动语义定义:

在现有的 C++ 机制中,我们可以定义拷贝构造函数和赋值函数。

要实现转移语义,需要定义转移构造函数,还可以定义转移赋值操作符。

对于右值的拷贝和赋值会调用转移构造函数和转移赋值操作符。

如果转移构造函数和转移拷贝操作符没有定义,那么就遵循现有的机制,拷贝构造函数和赋值操作符会被调用。

普通的函数和操作符也可以利用右值引用操作符实现转移语义。

C++右值引用_第6张图片

强制移动:move()

通常移动构造函数和移动运算符使用右值,但一定要他们使用左值的时候,使用move()

C++右值引用_第7张图片

C++中特殊的成员函数

默认构造函数

拷贝构造函数

拷贝赋值函数

移动构造函数

移动复制函数

析构函数

你可能感兴趣的:(C++,c++,开发语言)