C++ 新特性

慢慢完善

一、右值引用 移动赋值
移动不分配新内存,接管被移动对象的内存后,源对象的指针置为nullptr,然后销毁,这样本来的内存会被留下来。 

形式:

&a 左值引用, &&a右值引用
左值持久,右值短暂
int &&a =42 ; 对的,42字面常量是右值
int &&b = a; 错了, a变量时左值
int &&b = a*2; 错


新函数
int &&b = std::move(a); 显示调用移动构造。move()返回一个右值引用

要点:
1.移动操作不抛出异常
2.移动赋值运算符=
3.移动后源对象必须可析构
4.合成的移动操作和合成拷贝操作的条件大不相同。  大概是:如果一个类定义了自己的拷贝构造,拷贝赋值运算符,或析构函数,编译器就不会合成移动构造函数。 只有当一个类没有定义任何的版本控制成员,且数据可移动是,才会合成移动构造函数。
5.如果既有移动构造又有拷贝构造,则使用普通函数匹配规则确定使用哪一种。

用右值引用函数来受益:
void push_back(const X&);   //拷贝:绑定到任意类型的X
void push_back(X &&); //移动:只能绑定到类型X的可修改的右值

定义移动构造函数
StrVec::StrVec(StrVec &&s) noexcept  //不抛异常
     :elements(s.elements),first_free(s.first_free),cap(s.cap)//接管资源(这里为指针)
{
     s.elements = s.first_free = s.cap = nullptr; //准备析构
}


猜你喜欢

转载自blog.csdn.net/qq_30795577/article/details/80014893