摘要: 记住: 尽量以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) 编辑