摘要: 记住:为实现“连锁赋值”,赋值操作符必须返回一个reference指向操作符的左侧实参。 阅读全文
posted @ 2018-06-15 10:04 pfsi 阅读(136) 评论(0) 推荐(0) 编辑
摘要: delete 删除对象的时候,不用判断指针是否为空,因为delete中会判断的。 阅读全文
posted @ 2018-06-15 09:50 pfsi 阅读(108) 评论(0) 推荐(0) 编辑
摘要: 内存屏障有两个能力:1. 阻止屏障两边的指令重排序。2. 强制把写缓冲区/高速缓存中的脏数据等写回主内存,让缓存中相应的数据失效。 对Load Barrier来说,在读指令前插入读屏障,可以让高速缓存中的数据失效,重新从主内存加载数据。对Store Barrier来说,在写指令之后插入写屏障,能让写 阅读全文
posted @ 2018-06-13 09:24 pfsi 阅读(121) 评论(0) 推荐(0) 编辑
摘要: 记住:在构造和析构期间不要调用virtual函数,因为这类调用从不下降至derived class。 解决方法 注意,定义createLogString为static, 避免意外使用BuyTransaction对象内尚未初始化的成员变量。 阅读全文
posted @ 2018-06-11 22:27 pfsi 阅读(121) 评论(0) 推荐(0) 编辑
摘要: 记住:析构函数不要抛出异常。如果一个被析构函数调用的函数可能抛出异常,析构函数应该捕捉任何异常,忽悠异常或者结束程序。如果客户需要对某个操作函数运行期间抛出的异常做出反应,那么class应该提供一个普通函数执行该操作。 如果db.close()抛出异常,可能会造成麻烦。解决办法 或者忽略失败 比较好 阅读全文
posted @ 2018-06-11 21:36 pfsi 阅读(137) 评论(0) 推荐(0) 编辑
摘要: 记住:带多态性质的基类应该声明一个virtual析构函数。如果class带有任何virtual函数,它就应该拥有一个virtual析构函数。class的设计目的如果不是作为基类使用,或不是为了具备多态性,就不该声明virtual析构函数。 解决这个问题,只需要 virtual函数的目的是允许deri 阅读全文
posted @ 2018-06-10 21:39 pfsi 阅读(123) 评论(0) 推荐(0) 编辑
摘要: 记住:为防止编译器暗自提供的功能,可将相应的成员函数声明为privae并且不予实现。也可以使用Uncopyable这样的父类实现。 对于独一无二的对象,希望不支持拷贝构造函数和赋值操作符。 另一种方法 基类中 继承方式 子类中 public & public继承 => publicpublic & 阅读全文
posted @ 2018-06-09 22:10 pfsi 阅读(130) 评论(0) 推荐(0) 编辑
摘要: 记住:如果没有声明任何构造函数,编译器会声明一个默认构造函数。如果自己没有声明,编译器会声明一个拷贝构造函数,一个赋值操作符和一个析构函数。 不能。对于内含引用成员的类,必须自己定义赋值操作符。 更改const成员是不合法的。另外,如果父类将copy assignment操作符声明为private, 阅读全文
posted @ 2018-06-09 21:28 pfsi 阅读(137) 评论(0) 推荐(0) 编辑
摘要: 记住: 对于内置类型以外的任何其它东西,初始化责任落在构造函数身上,确保每个构造函数都将对象的每一个成员初始化。 C++规定,对象的成员变量的初始化动作发生在进入构造函数本体之前。 使用成员初始化列表替换构造函数内的赋值动作。 如果成员变量是const或reference,它们就一定需要初值,不能被 阅读全文
posted @ 2018-06-09 17:23 pfsi 阅读(117) 评论(0) 推荐(0) 编辑
摘要: 记住: const可被施加于任何作用域内的对象,函数参数,函数返回类型,成员函数体。 编译器强制实施bitwise constness,但编写程序时应该使用“概念上的常量性“。 当const和non-const成员函数有着等价实现时,令non-const版本调用const版本可避免重复代码。 mut 阅读全文
posted @ 2018-06-09 16:41 pfsi 阅读(144) 评论(0) 推荐(0) 编辑