C++ Primer 5th 第13章 拷贝控制】的更多相关文章

当一个对象的引用或者指针离开作用域时,析构函数不会执行. 构造函数有初始化部分(初始化列表)和函数体. 析构函数有析构部分和函数,但析构函数的析构部分是隐式的.…
定义一个类时,可显式或隐式的指定在此类型对象上拷贝.移动.赋值.销毁时做什么.通过5种成员函数实现拷贝控制操作: 拷贝构造函数:用同类型的另一个对象初始化本对象时做什么(拷贝初始化) 拷贝赋值算符:将同类型的另一个对象赋值给本对象时做什么(拷贝赋值) 移动构造函数:用同类型的另一个对象初始化本对象时做什么(移动初始化) 移动赋值算符:将同类型的另一个对象赋值给本对象时做什么(移动赋值) 析构函数:本对象销毁时做什么 如果类未定义这些拷贝控制成员,编译器会自动合成一部分缺失的操作,因此很多类不需要…
拷贝, 赋值与销毁 当定义一个类时, 我们显示地或隐式地指定在此类型的对象拷贝, 移动, 赋值和销毁时做什么. 一个类通过定义5种特殊的成员函数来控制这些操作, 包括: 拷贝构造函数, 拷贝赋值运算符, 移动构造函数, 移动赋值运算符和析构函数. 编译器可以合成这些成员函数, 其他的函数不能合成. 拷贝和移动构造函数定义了当用同类型的一另一个对象初始化本对象时做什么, 拷贝和移动赋值运算符定义了将一个对象赋予同类型的另一个对象时做什么. 这些操作称为拷贝控制操作. 如果我们不显式地定义这些操作,…
拷贝和移动构造函数定义了当用同类型的另一个对象初始化本对象时做什么.拷贝和移动赋值运算符定义了将一个对象赋予同类型的另一个对象时做什么.析构函数定义了当此类型对象销毁时做什么.我们称这些操作为拷贝控制操作. 如果一个构造函数的第一个参数是自身类类型的引用,且任何额外参数都有默认值,则此构造函数是拷贝构造函数. 拷贝构造函数的第一个参数必须是一个引用类型.虽然我们可以定义一个接受非const引用的拷贝构造函数,但此参数几乎总是一个const的引用. 拷贝构造函数在几种情况下都会被隐式地使用.因此,…
拷贝构造函数 一个构造函数的第一个参数是自身类类型的引用,额外的参数(如果有)都有默认值,那么这个构造函数是拷贝构造函数.拷贝构造函数的第一个参数必须是一个引用类型. 合成的拷贝构造函数   在我们没有定义自己的拷贝构造函数,编译器会为我们合成一个.但是对于有些类来说,合成拷贝构造函数用来阻止我们拷贝该类类型的对象.而一般情况,合成拷贝构造函数会将其参数的成员逐个拷贝到正在创建的对象中,编译器依次将每个非static成员拷贝到正在创建的对象中. 每个成员的类型决定了它如何拷贝:对类类型的成员,…
右值引用 所谓的右值引用就是必须将引用绑定到右值的引用,我们通过&&来绑定到右值而不是&, 右值引用只能绑定到即将销毁的对象.右值引用也是引用,因此右值引用也只不过是对象的别名而已.右值引用可以绑定到要求转换的表达式.字面常量或者返回右值的表达式,但是右值不能绑定到一个左值上. 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())…
当运算符作用域类类型的对象时,可以通过运算符重载来重新定义该运算符的含义.重载运算符的意义在于我们和用户能够更简洁的书写和更方便的使用代码. 基本概念 重载的运算符是具有特殊名字的函数:函数名由关键词operator和跟运算符号组成. 和普通函数相同,重载的运算符也包含返回值.形参列表和函数体.运算符函数的参数和该运算符的作用对象数量一样多.一元运算符只有一个参数,二元运算符有两个.对于二元运算符来说,第一个参数对应运算符左侧运算对象,第二个参数对应运算符右侧运算对象.运算符一律不允许含有默认实…
合成拷贝控制与继承 #include <iostream> using namespace std; class Base { public: Base() { cout << "Base contruction" << endl; } virtual ~Base() { cout << "Base deconstruction" << endl; } }; class Derived : public B…
/* 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…