目录
移动构造和移动赋值
- 作用:对象移动,解决(临时)对象拷贝带来的开销问题。
Test getTest() //类中 { Test t(“hello world”); //在退出函数时空间自动释放 return t; //而此时又需要有返回值,就产生了临时对象 } Test t1 = getTest(); //当移动构造函数未定义时,这里的t1想接收t时会调用拷贝构造函数 //并且过程中会开辟一段新空间保存,产生额外开销
- 移动拷贝构造函数:Test (const Test && other){}
- 移动赋值运算符:Test & operator=( Test && other){}
①不使用&&,形参为对象生成临时对象,必然会调用耗时、开销大的拷贝构造函数。
②&左值引用,&&右值引用,使用std::move()可将左值转为右值。
③若没有声明,系统会自动生成默认的移动构造函数。
④移动不是内存数据移动到其他内存,而是变更所有权。
注:变更所有权不是变更所有属性的所有权。 - 引入右值引用的目的:提高程序运行效率、把拷贝对象变成移动对象,省去调用拷贝、赋值开辟空间的过程。
补充·左值右值:可以通过&运算符获取地址的(可以绑定到其他引用的也是左值),就是左值,否则是右值。临时对象都是右值;有返回值的函数返回的都是右值。
Test(Test && other) noexcept
{
this->m_name = other.m_name;
other.m_name = nullptr;
std::cout << "移动构造函数" << std::endl;
}
Person& operator=(Person&& person) noexcept
{
if (this != &person) {
name_ = person.name_;
std::cout << "移动赋值运算符" << std::endl;
}
return *this;
//main中
Person person1("xiaohong");
Person person2("xiaoming");
Person person3(getPerson());
Person person4(std::move(person1));//移动构造函数
Person person6("xiaolan");
person6 = std::move(person3);//移动赋值运算
Person person7("xiaoqi");
person7 = Person("xiaoqi");//移动赋值运算
}