
More Effective C++笔记
More Effective C++ 学习笔记
持续学习,不断沉淀
C++开发工程师
展开
-
附录9.3:C++中统计物件个数的完整版实现:把 Counter 变成一个 template
1、编写可以计数的类://.hclass Widget { public: Widget() { ++count; } Widget(const Widget&) { ++count; } ~Widget() { --count; } static size_t howMany() { return count; } private: static size...原创 2020-04-09 16:10:44 · 525 阅读 · 0 评论 -
条款M33:将非尾端类设计为抽象类:将抽象类赋值运算符函数设为protected
1、常遇到的代码问题:class Animal { //抽象类public: Animal& operator=(const Animal& rhs); virtual ~Animal() = 0; //cpp文件必须提供实现}; class Lizard: public Animal { public: Lizard& operator=(const...原创 2020-04-09 12:29:37 · 310 阅读 · 0 评论 -
纯虚函数的实现案例:纯虚析构函数必须有实现
纯虚函数可以有实现:唯一麻烦就是必须在类的定义之外(cpp文件)实现它。申明一个函数为纯虚并不意味着它没有实现,它意味着:当前类是抽象类 ;任何从此类派生的实体类必须将此函数申明为一个“普通”的虚函数(也就是说,不能带“= 0”)。1、纯虚函数例子:声明一个pure virtual函数的目的是为了让derived classes只继承函数接口,派生类必须提供实现。可以为pure ...原创 2020-04-09 11:28:19 · 3321 阅读 · 0 评论 -
条款M31:让函数根据一个以上的对象来决定怎么虚拟:(2)通过模拟虚函数表实现二重调度
通过模拟虚函数表实现二重调度相比条款M31(1)中所提方法效率更高,但更复杂。(PS:但书中此部分代码语法很漂亮,经典)虚函数表:根据对象动态类型选择调用某一个函数。1、整体代码:a) 基础继承体系代码:class GameObject { //抽象基类public: virtual void collide(GameObject& otherObject) = 0; ...原创 2020-04-01 17:40:45 · 170 阅读 · 0 评论 -
条款M31:让函数根据一个以上的对象来决定怎么虚拟:(1)通过 RTTI 或虚函数实现二重调度
需要解决的问题:(ps:代码太多,主要看注释)//.hclass GameObject { ... }; class SpaceShip: public GameObject { ... }; class SpaceStation: public GameObject { ... }; class Asteroid: public GameObject { ... };//.cpp...原创 2020-04-01 14:56:22 · 137 阅读 · 0 评论 -
条款M30:代理类
在代理 proxy 类上只能做三件事:创建它,也就是指定它扮演哪个字符。将它作为赋值操作的目标,在这种情况下可以将赋值真正作用在它扮演的字符上。这样被使用时,proxy 类扮演的是左值。用其它方式使用它。这时,代理类扮演的是右值。...原创 2020-03-30 15:06:24 · 132 阅读 · 0 评论 -
条款29:引用计数;设计引用计数类、给现有类增加引用计数功能
1、设计引用计数类:以string类为例,其结构为:1、string类包含一个智能指针;2、智能指针指向包含引用计数的类对象StringValue;3、类对象StringValue继承自通用引用计数基类RCObject(该基类内含计数器);4、类对象StringValue包含一个指针指向实际堆内存(string类的真实内容)。与普通堆上对象的差别: 普通堆对象包含一个指针,该指针直接...原创 2020-03-30 11:14:53 · 297 阅读 · 0 评论 -
条款M28:智能指针模板基础源码,涉及知识点:成员函数模板、隐式类型转换、运算符重载。
1、智能指针模板基础代码:注:关注注释部分内容//.htemplate<class T>class auto_ptr { public: auto_ptr(T *ptr = 0): pointee(ptr) {} // 构造函数,构造智能指针,指向dumb pointer ...原创 2020-03-29 15:36:16 · 489 阅读 · 0 评论 -
分清new operator关键字与operator new操作符函数;了解重载operator new的调用问题
1、解释:new operator:指我们在C++里通常用到的关键字,比如A* a = new A;operator new:它是一个操作符,并且可被重载(类似加减乘除的操作符重载)A* a = new A;2、执行过程:由operator new(size_t)来分配内存,如果类A重载了operator new,那么将调用A::operator new(size_t ),否则调用全...原创 2020-03-29 09:35:33 · 628 阅读 · 0 评论 -
条款M27:要求或禁止在堆中产生对象(2):禁止在堆中产生对象
禁止在堆中产生对象实现方式:将建立堆对象的new操作符声明为 private。1、禁止用户直接实例化对象:如:class UPNumber { private: static void *operator new(size_t size); static void operator delete(void *ptr); ... }; //.cppUPNumber ...原创 2020-03-28 16:27:00 · 204 阅读 · 0 评论 -
条款M27:要求或禁止在堆中产生对象(1):只能在堆中产生对象
1、要求在堆中建立对象:因为非堆对象在结束时自动调用析构函数,因此其析构函数必须申明为public。所以只要将类的析构函数声明为private即可实现这种限制,同时可以引进一个专用的伪析构函数,用来访问真正的析构函数,释放建立的对象。例:注意看注释//.hclass UPNumber { public: UPNumber(); UPNumber(int init Value)...原创 2020-03-28 16:02:08 · 130 阅读 · 0 评论 -
条款M26:限制某个类所能产生的对象数量(2):一定个数对象
原理:利用类中static变量统计已生成对象个数。例子://.hclass Printer { public: class TooManyObjects{}; //用于抛出异常 // 伪构造函数 static Printer * makePrinter(); //用于构造对象 static Printer * makePrinter(const Printer&am...原创 2020-03-27 17:49:54 · 223 阅读 · 0 评论 -
条款M26:限制某个类所能产生的对象数量(1):单例模式
1、只允许建立一个对象(单例模式):a)方法一:非成员函数包含静态对象//.hclass Printer { public: void submitJob(const Print Job& job); void reset(); void performSelf Test(); ... friend Printer& thePrinter(); ...原创 2020-03-27 16:50:30 · 146 阅读 · 0 评论 -
条款M25:将构造函数和非成员函数虚拟化
1、虚拟构造函数:应用场景:根据从磁盘读取的不同对象信息,构造不同对象。//.hclass NLComponent { //用于 newsletter components public: // 的抽象基类 ... //包含至少一个纯虚函数 }...原创 2020-03-27 11:49:22 · 163 阅读 · 0 评论 -
条款20:C++返回值优化
1、函数按值返回的代码:const Rational operator*(const Rational& lhs, const Rational& rhs) { Rational result(lhs.numerator() * rhs.numerator(), lhs.denom...原创 2020-03-26 17:10:46 · 234 阅读 · 0 评论 -
try throw catch笔记:条款12:抛出异常与传递参数的差异;条款13:通过引用捕获异常;条款14:审慎使用异常规格
try { if(...) throw ...; ... // 其余代码}catch (异常类型){ //处理代码}catch (...) // 捕获所有类型异常{ ...}int * point = new (std::nothrow) int;// 禁止内存分配错误输出异常,而是返回NULL指针。 在触发throw时,发生栈解退:释放调用栈中内容直到遇到tr...原创 2020-03-07 11:10:50 · 486 阅读 · 0 评论 -
条款10:在构造函数中防止资源泄露;条款11:禁止异常信息传递到析构函数外
条款10:在构造函数中防止资源泄露:1、构造函数中利用智能指针管理类成员变量,在构造中途发生错误时保证自动销毁变量。参考资料:条款13-17:资源管理,std::shared_ptrclass A{private: std::shared_ptr<int> pt;public: A(int v1):pt(new int(v1)){ ... //若此处执行错误,导致构造...原创 2020-03-25 18:14:13 · 181 阅读 · 0 评论 -
条款3:不要对数组使用多态,例:不用基类指针删除派生类对象数组
错误代码://.hclass A{ int a;public: A(v1):a(v1=3){...}; virtual ~A();};class B:public A{ double b;public: B(v1=1,v2=2):b(v2),A(v1){...}; virtual ~B();};//.cppvoid show(const A tmp[],int co...原创 2020-03-25 11:28:50 · 203 阅读 · 0 评论