06 2018 档案

摘要:记住: 尽量以pass-by-reference-to-const替换pass-by-value。前者通常比较高效,并可避免切割问题(slicing problem)。 以上规则并不适用于内置类型,以及STL的迭代器和函数对象。对它们而言,pass-by-value往往比较适当。 阅读全文
posted @ 2018-06-23 21:54 pfsi 阅读(241) 评论(0) 推荐(0) 编辑
摘要:记住: 在定义一个新type之前,确定已经考虑过本条款覆盖的主题 要设计高效的class,需要回答以下的问题:1. 对象如何去创建和销毁?这是构造函数和析构函数的问题,当然如果想要有堆分配方式,还需要重载new、new[]、delete和delete[]运算符; 2. 对象初始化与对象的赋值应该有什 阅读全文
posted @ 2018-06-23 17:39 pfsi 阅读(127) 评论(0) 推荐(0) 编辑
摘要:记住: 好的接口容易被正确使用,不容易被误用。你应该在你的所有接口中努力达成这些性质。 促进正确使用的办法包括接口的一致性,以及与内置类型的行为兼容。 阻止误用的办法包括建立新类型,限制类型上的操作,束缚对象值,以及消除客户的资源管理责任。 tr1::shared_ptr支持定制型删除器。这可被用来 阅读全文
posted @ 2018-06-23 17:08 pfsi 阅读(146) 评论(0) 推荐(0) 编辑
摘要:记住: 以独立语句将newd对象存储于智能指针内。如果不这样做,一旦异常被抛出,有可能导致难以察觉的资源泄漏。 阅读全文
posted @ 2018-06-23 13:29 pfsi 阅读(133) 评论(0) 推荐(0) 编辑
摘要:记住: 如果你在new表达式中使用[ ],必须在相应的delete表达式中也是用[ ]。如果你在new时不使用[ ],一定不要在delete时使用[ ]。 最好不要用数组形式做typedef,基本都可以使用vector之类的 阅读全文
posted @ 2018-06-23 11:46 pfsi 阅读(117) 评论(0) 推荐(0) 编辑
摘要:记住: APIs往往要求访问原始资源,所以每一个RAII类应该提供一个“取得其所管理之资源”的办法。 对原始资源的访问可能经由显示转换或隐式转换。一般而言显示转换比较安全,但隐式转换对客户比较方便。 tr1::shared_ptr和auto_ptr重载了指针取值操作符 (operator->和ope 阅读全文
posted @ 2018-06-18 15:27 pfsi 阅读(182) 评论(0) 推荐(0) 编辑
摘要:注意: 赋值RAII对象必须一并复制它所管理的资源,所以资源的拷贝行为决定RAII对象的拷贝行为。 普遍而常见的RAII类拷贝行为是:抑制拷贝,实行引用计数法。 Lock ml1(&m);Lock ml2(ml1); //将ml1复制到ml2身上,会发生什么? 解决办法1. 禁止复制,把拷贝操作定义 阅读全文
posted @ 2018-06-18 14:55 pfsi 阅读(114) 评论(0) 推荐(0) 编辑
摘要:记住: 为防止资源泄漏,请使用RAII对象,它们在构造函数中获得资源并在析构函数中释放资源。 两个常被使用的RAII类分别是tr1::shared_ptr和auto_ptr。前者通常是较佳选择,因为其copy行为比较直观。若选择auto_ptr,复制动作会使它(被复制物)指向null。 使用auto 阅读全文
posted @ 2018-06-18 12:44 pfsi 阅读(121) 评论(0) 推荐(0) 编辑
摘要:记住:拷贝函数应该确保复制“对象内的所有成员变量”及“所有父类成分”。不要尝试以某个拷贝函数实现另一个拷贝函数。应该将共同机能放进第三个函数中,并由两个拷贝函数共同调用。下面是一个类实现了自己的拷贝函数,一起正常。 但如果你为class添加一个成员变量,你必须同时修改拷贝函数。如果忘记了,编译器不会 阅读全文
posted @ 2018-06-17 14:45 pfsi 阅读(132) 评论(0) 推荐(0) 编辑
摘要:注意:确保当对象自我赋值时operator=有良好行为。 如果是自我赋值,那rhs.pb就已经被delete pb了。解决方法:比较是否同一个对象 上面的代码还有个潜在问题,如果Bitmap出现异常了,但pb已经被delete了。较好的一个方法: 另外一个方式是使用copy and swap 阅读全文
posted @ 2018-06-15 13:23 pfsi 阅读(131) 评论(0) 推荐(0) 编辑
摘要:记住:为实现“连锁赋值”,赋值操作符必须返回一个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) 编辑
摘要:记住: 对于单纯常量,最好以const对象或者enum替换#define。 对于形似函数的宏,最好改用inline函数替换。 scores数组用到了NumTurns,所以必须在类定义中给NumTurns赋值。 如果某些编译器不支持这个,可以采用#define 但有个缺点,不能把#define的作用域 阅读全文
posted @ 2018-06-08 11:34 pfsi 阅读(178) 评论(0) 推荐(0) 编辑
摘要:git remote -vgit remote add upstream https://xxx/abc.gitgit fetch upstreamgit merge upstream/mastergit push origin master 阅读全文
posted @ 2018-06-08 09:28 pfsi 阅读(85) 评论(0) 推荐(0) 编辑
摘要:#include #include #include #include #include #include using namespace std; int main() { ifstream in_file("a.txt"); ofstream out_file("b.txt"); if (!in_file || !out_file) { ... 阅读全文
posted @ 2018-06-07 09:47 pfsi 阅读(115) 评论(0) 推荐(0) 编辑