//1.当定义一个类时,我们显示地或隐式地指出在此类型的对象(注意这里是此类型的对象,而不包括此类型的指针)拷贝,移动,赋值,销毁时做什么.一个类通过定义五种特殊的成员函数来控制这些操作:拷贝构造函数,拷贝赋值运算符,移动构造函数,移动赋值运算符,析构函数. //当定义了五种特殊成员函数的其中一个的时候,一般也需要定义其他几个操作. //拷贝构造函数的第一个参数必须是一个引用类型,若第一个参数不是引用类型则会造成逻辑错误:传值调用会产生一个临时对象,而此对象必须通过类的拷贝构造函数生成,所以会陷…
右值引用 所谓的右值引用就是必须将引用绑定到右值的引用,我们通过&&来绑定到右值而不是&, 右值引用只能绑定到即将销毁的对象.右值引用也是引用,因此右值引用也只不过是对象的别名而已.右值引用可以绑定到要求转换的表达式.字面常量或者返回右值的表达式,但是右值不能绑定到一个左值上. int i = 42; int &r = i; // 正确,r引用i int&& rr = i; // 错误,不能将右值引用绑定到左值 int &r2 = i * 42; /…
定义行为像值的类 行为像值的类,例如标准库容器和std::string这样的类一样,类似这样的类我们可以简单的实现一个这样的类HasPtr. 在实现之前,我们需要: 定义一个拷贝构造函数,完成string的拷贝,而不是指向string的指针的拷贝: 定义一个拷贝赋值运算符,释放当前的string,并从右侧拷贝新的string. 定义一个析构函数来释放string class HasPtr { public: HasPtr(const std::string& s = std::string())…
拷贝构造函数 一个构造函数的第一个参数是自身类类型的引用,额外的参数(如果有)都有默认值,那么这个构造函数是拷贝构造函数.拷贝构造函数的第一个参数必须是一个引用类型. 合成的拷贝构造函数   在我们没有定义自己的拷贝构造函数,编译器会为我们合成一个.但是对于有些类来说,合成拷贝构造函数用来阻止我们拷贝该类类型的对象.而一般情况,合成拷贝构造函数会将其参数的成员逐个拷贝到正在创建的对象中,编译器依次将每个非static成员拷贝到正在创建的对象中. 每个成员的类型决定了它如何拷贝:对类类型的成员,…
拷贝控制示例 #include<iostream> #include<string> #include<set> #include<vector> using namespace std; class Folder; class Message { friend void swap(Message&, Message&); friend class Folder; public: explicit Message(const string &…
  1.类的行为分类:看起来像一个值:看起来想一个指针.     1)类的行为像一个值,意味着他应该有自己的状态.当我们拷贝一个像值的对象时,副本和原对象是完全独立的.改变副本不会对原有对象有任何影响,反之亦然.     2)行为像指针的类则共享状态.当我们拷贝一个这种类的对象时,副本和原对象使用相同的底层数据.改变副本也会改变原对象,反之亦然.     3)举例:标准库容器和string类行为像一个值:shared_ptr行为类似指针:IO类型和unique_ptr不允许拷贝或者赋值,他们既不…
/* Message.h */ #ifndef _MESSAGE_H_ #define _MESSAGE_H_ #include <iostream> #include <string> #include <set> class Folders; class Message { friend class Folders; public: // Default Constructor explicit Message (const std::string& str…
/* StrVec.h */ #ifndef _STRVEC_H_ #define _STRVEC_H_ #include <memory> #include <string> #include <vector> #include <utility> class StrVec { public: StrVec() : first(nullptr), last_end(nullptr), cap(nullptr){} StrVec(const StrVec&a…
拷贝, 赋值与销毁 当定义一个类时, 我们显示地或隐式地指定在此类型的对象拷贝, 移动, 赋值和销毁时做什么. 一个类通过定义5种特殊的成员函数来控制这些操作, 包括: 拷贝构造函数, 拷贝赋值运算符, 移动构造函数, 移动赋值运算符和析构函数. 编译器可以合成这些成员函数, 其他的函数不能合成. 拷贝和移动构造函数定义了当用同类型的一另一个对象初始化本对象时做什么, 拷贝和移动赋值运算符定义了将一个对象赋予同类型的另一个对象时做什么. 这些操作称为拷贝控制操作. 如果我们不显式地定义这些操作,…
第十三章 拷贝控制 定义一个类时,需要显式或隐式地指定在此类型地对象拷贝.移动.赋值和销毁时做什么. 一个类通过定义五种特殊的成员函数来控制这些操作.即拷贝构造函数(copy constructor).拷贝赋值运算符(copy-assignment operator).移动构造函数(move constructor).移动赋值运算符(move-assignment operator).析构函数(destructor). 拷贝和移动构造函数定义了当用同类型的另一个对象初始化对象时做什么.拷贝和移动…