条款35 考虑virtual函数以外的其他选择 记住: ★virtual函数的替代方案包括NVI手法及Strategy模式的多种形式.NVI手法自身是一个特殊形式的Template Method模式 ★将机能从成员函数移到class外部函数,带来的一个缺点是,非成员函数无法访问class的non-public成员 ★tr1::function对象的行为就像一般函数指针.这样的对象可接纳“与给定之目标签名式兼容”的所有可调用物 -----------------------------------…
条款16 成对使用new和delete时要采取相同形式 记住: ★若你在new表达式中使用[ ],必须在相应的delete中也使用[ ],反之亦然 ------------------------------------------------------------------ 当结合typedef使用时,应特别注意:如: typedef std::string AddressLines[4]; std::string *pal = new AddressLines; //等同于new str…
条款18 让接口容易被正确使用,不易被误用 记住: ★“促进正确使用”的办法包括接口的一致性,以及与内置类型的行为兼容 ★“阻止误用”的办法包括建立新类型.限制类型上的操作,束缚对象值,以及消除客户的资源管理责任(即类的设计者应先发制人). ★tr1::shared_ptr支持定制型删除器.这可防范DLL问题,可被用来自动解除互斥锁等等. -------------------------------------------------------------------------- C++的…
条款1:视C++为一个语言联邦 记住: ★C++高效编程守则视状况而变化,这取决于你使用C++的哪一部分 C: Object-oriented c++: Template c++: STL 条款2:尽量以const,enum,inline替换#define 记住: ★对于单纯常量,最好以const对象或enums替换#define ★对于形似函数的宏,最好改用inline函数替换#define ---------------------------------------------------…
条款53 不要轻忽编译器的警告 记住: ★严肃对待编译器发出的警告信息.努力在你的编译器的最高(最严苛)警告级别下争取“无任何警告”的荣誉 ★不要过度依赖编译器的报警能力,∵不同的编译器对待事情的态度并不相同.一旦移植到另一个编译器上,你原本倚赖的警告信息有可能消失. 条款54 让自己熟悉包括TR1在内的标准程序库 记住: ★C++标准程序库的主要机能由STL.iostreams.locales组成.并包含C99标准程序库. ★TR1添加了智能指针(tr1::shared_ptr).一般化函数指…
条款49 了解new-handler的行为 记住: ★set_new_handler允许客户指定一个函数,在内存分配无法获得满足时被调用 ★Nothrow new是一个颇为局限的工具,∵其只适用于内存分配:后继的构造函数调用还是可能抛出异常 ----------------------------------------------------------------------------------- new操作符私底下通过调用operator new来实现内存分配.当operator ne…
条款47 请使用traits classes表现类型信息 记住: ★Traits classes使得“类型相关信息”在编译期可用.它们以templates和“templates特化”完成实现 ★整合重载技术后,traits classes有可能在编译期对类型执行if...else测试 --------------------------------------------------------- STL共有5种迭代器: ①Input迭代器: 如:istream_iterator 仅前移,一次一…
条款41 了解隐式接口与编译器多态 记住: ★classes和templates都支持接口和多态 ★对classes而言接口是显式的(explicit),以函数签名为中心.多态则是通过virtual函数发生于运行期 ★对templates而言,接口是隐式的(implicit),奠基于有效表达式.多态则是通过template具现化和函数重载解析发生于编译期 条款42 了解typename的双重意义 记住: ★声明template参数时,前缀关键字class和typename可互换(函数模板或类模板…
条款32 确保你的public继承塑模出is-a关系 记住: ★public继承意味着is-a.适用于base class身上的每一件事情一定也适用于derived class身上,∵每一个derived class对象也都是一个base class对象. 条款33 避免遮掩继承而来的名称 记住: ★derived classes内的名称会遮掩base classes内的名称.在public继承下从来无人希望如此 ★为了让被遮掩的名称再见天日,可使用using声明式或转交函数 ---------…
条款26 尽可能延后变量定义式的出现时间(Lazy evaluation) 记住: ★尽可能延后变量定义式的出现.这样做可增加程序的清晰度并改善程序效率 ---------------------------------------------------------------------- 举例说明: std::string encryptPassword( const std::string &password ) { using namespace std; string encrypt…