概述
(1)类的行为像一个值,意味着它应该也有自己的状态,行为像指针的类则共享状态。
(2)为了提供类值得行为,对于类管理的资源,每个对象都应该拥有一份自己的拷贝。
(3) 与拷贝控制成员不同,swap并不是必要的。但是,对于分配了资源的类,定义swap可能是一种重要的优化手段。
(4) 使用拷贝和交换的赋值运算符自动就是异常安全的,且能正确处理自赋值。
(5) 拷贝赋值运算符通常执行拷贝构造函数和析构函数中也要做的工作。这种情况下,公共的工作应该放在private的工具函数中完成。
(6) 定义一个类vector<string>的类StrVec:
class StrVec{
public :
StrVec : elements(nullptr) , first_free(nullptr) , cap(nullptr) { }
StrVec(const StrVec&);
~StrVec();
void push_back(const std::string&);
size_t size() const {return first_free - elements;}
size_t capacity() const {return cap - elements;}
std::string *begin() const {return elements;}
std::string *end() const {renturn first_free;}
private :
static std::allocator<std::string> alloc;
void chk_n_alloc() {if (size() == capacity()) reallocate();}
std::pair<std::string*, std::string*> alloc_n_copy(const std::string* , const std::string*);
void free();
void reallocate();
std::string *elements;
std::string *first_free;
std::string *cap;
};
(7)关于string的移动构造函数如何工作的细节,以及有关实现的任何其他细节,目前都是尚未公开的。
(8)新标准的一个最主要的特性是可以移动而非拷贝对象的能力。
(9)标准库容器、string和shared_ptr类既支持移动也支持拷贝。IO类和unique_ptr类可以移动都是不可以拷贝。
(10)左值持久,右值短暂,右值引用指向将要被销毁的对象。因此我们可以从绑定到右值引用的对象“窃取”状态。
(11)变量是左值,因此我们不能将一个右值引用直接绑定到一个变量上,即使这个变量是右值引用类型也不行。
(12)我们可以销毁一个移后源对象,也可以赋予它新值,但不能使用一个移后源对象的值。
(13) 由于移动操作“窃取”资源,它通常不分配任何资源。因此,移动操作通常不会抛出任何异常。
(14)不抛出异常的移动构造函数和移动赋值运算符必须标记为noexcept。
(15) 在移动操作后,移后源对象必须保持有效地,可析构的状态,但是用户不能对其值进行任何假设。
(16) 只有当一个类没有定义任何自己版本的拷贝成员,且它的所有数据成员都能移动构造或移动赋值时,编译器才会为它合成移动构造函数或移动赋值运算符。
(17) 定义了一个移动构造函数或移动赋值运算符的类必须也定义自己的拷贝操作。否则,这些成员默认的被定义删除。
(18)如果一个类有一个可用的拷贝构造函数而没有移动构造函数,则其对象是通过拷贝构造函数来“移动”的。拷贝赋值运算符和移动赋值运算符的情况类似。
最后
以上就是忐忑咖啡豆为你收集整理的从零单排c++ primer(13)的全部内容,希望文章能够帮你解决从零单排c++ primer(13)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复