移动构造函数及右值左值引用详解

本文深入探讨了C++中的移动构造函数,解释了如何通过移动构造函数优化对象构造,避免不必要的内存分配。同时,文章阐述了左值和右值的概念,以及它们在C++11中如何通过右值引用实现资源的有效转移,提升性能。最后,介绍了左值引用和右值引用的区别,以及右值引用在处理临时对象中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.移动构造函数:

  1. 有时候我们会遇到这样一种情况,我们用对象a初始化对象b后对象a我们就不在使用了,但是对象a的空间还在呀(在析构之前),既然拷贝构造函数,实际上就是把a对象的内容复制一份到b中,那么为什么我们不能直接使用a的空间呢?这样就避免了新的空间的分配,大大降低了构造的成本。这就是移动构造函数设计的初衷;
  2. 拷贝构造函数中,对于指针,我们一定要采用深拷贝,而移动构造函数中,对于指针,我们采用
    浅拷贝;
  3. 与拷贝类似,移动也使用一个对象的值设置另一个对象的值。但是,又与拷贝不同的是,移动实现的是对象值真实的转移(源对象到目的对象):源对象将丢失其内容,其内容将被目的对象占有。移动操作的发生的时候,是当移动值的对象是未命名的对象的时候。这里未命名的对象就是那些临时变量,甚至都不会有名称。典型的未命名对象就是函数的返回值或者类型转换的对象

使用移动构造函数和移动赋值:当使用一个临时变量对象进行构造初始化的时候,调用移动构造函数。类似的,使用未命名的变量的值赋给一个对象时,调用移动赋值操作;
代码如下:

Example6 (Example6&& x) : ptr(x.ptr) 
 {
 x.ptr = nullptr;
 }
 // move assignment
 Example6& operator= (Example6&& x) 
 {
 delete ptr; 
 ptr = x.ptr;
 x.ptr=nullptr;
 return *this;
}

2. 左值右值:

C++11正是通过引入右值引用来优化性能,具体来说是通过移动语义来避免无谓拷贝的问题,通过move语义来将临时生成的左值中的资源无代价的转移到另外一个对象中去,通过完美转发来解决不能按照参
数实际类型来转发的问题。
左值:表示的是可以获取地址的表达式,它能出现在赋值语句的左边,对该表达式进行赋值。可
以取地址的、有名字的就是左值。
右值:表示无法获取地址的对象,有常量值、函数返回值、lambda表达式等。无法获取地址,但不表示其不可改变,当定义了右值的右值引用时就可以更改右值。不能取地址的、没有名字的就是右值。

3. 左值右值引用:

左值引用:传统的C++中引用被称为左值引用
右值引用:C++11中增加了右值引用,右值引用关联到右值时,右值被存储到特定位置,右值引用指向
该特定位置,也就是说,右值虽然无法获取地址,但是右值引用是可以获取地址的,该地址表示临时对象的存储位置

举个例子:

#include <bits/stdc++.h>
using namespace std;
template<typename T>
void fun(T&& t)
{
 cout << t << endl;
}
int getInt()
{
 return 5;
}
int main() {
 
 int a = 10;
 int& b = a; //b是左值引用
 int& c = 10; //错误,c是左值不能使用右值初始化
 int&& d = 10; //正确,右值引用用右值初始化
 int&& e = a; //错误,e是右值引用不能使用左值初始化
 const int& f = a; //正确,左值常引用相当于是万能型,可以用左值或者右值初始化
 const int& g = 10;//正确,左值常引用相当于是万能型,可以用左值或者右值初始化
 const int&& h = 10; //正确,右值常引用
 const int& aa = h;//正确
 int& i = getInt(); //错误,i是左值引用不能使用临时变量(右值)初始化
 int&& j = getInt(); //正确,函数返回值是右值
 fun(10); //此时fun函数的参数t是右值
 fun(a); //此时fun函数的参数t是左值
 return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值