随笔分类 - C/C++
摘要:条款53 不要轻忽编译器的警告记住:★严肃对待编译器发出的警告信息。努力在你的编译器的最高(最严苛)警告级别下争取“无任何警告”的荣誉★不要过度依赖编译器的报警能力,∵不同的编译器对待事情的态度并不相同。一旦移植到另一个编译器上,你原本倚赖的警告信息有可能消失。条款54 让自己熟悉包括TR1在内的标...
阅读全文
摘要:条款49 了解new-handler的行为记住:★set_new_handler允许客户指定一个函数,在内存分配无法获得满足时被调用★Nothrow new是一个颇为局限的工具,∵其只适用于内存分配;后继的构造函数调用还是可能抛出异常---------------------------------...
阅读全文
摘要:条款47 请使用traits classes表现类型信息记住:★Traits classes使得“类型相关信息”在编译期可用。它们以templates和“templates特化”完成实现★整合重载技术后,traits classes有可能在编译期对类型执行if...else测试-----------...
阅读全文
摘要:条款41 了解隐式接口与编译器多态记住:★classes和templates都支持接口和多态★对classes而言接口是显式的(explicit),以函数签名为中心。多态则是通过virtual函数发生于运行期★对templates而言,接口是隐式的(implicit),奠基于有效表达式。多态则是通过...
阅读全文
摘要:条款35 考虑virtual函数以外的其他选择记住:★virtual函数的替代方案包括NVI手法及Strategy模式的多种形式。NVI手法自身是一个特殊形式的Template Method模式★将机能从成员函数移到class外部函数,带来的一个缺点是,非成员函数无法访问class的non-publ...
阅读全文
摘要:条款26 尽可能延后变量定义式的出现时间(Lazy evaluation)记住:★尽可能延后变量定义式的出现。这样做可增加程序的清晰度并改善程序效率----------------------------------------------------------------------举例说明:s...
阅读全文
摘要:记住:★当std::swap对你的类型效率不高时,提供一个swap成员函数,并确定其不抛出异常★若你提供一个member swap,也该提供一个non-member swap来调用前者。对于classes(而非templates),也请特化std::swap★调用swap时应针对std::swap使...
阅读全文
摘要:条款22 将成员变量声明为private记住:★切记将成员变量声明为private。这可赋予客户访问数据的一致性、可细微划分访问控制、允诺约束条件获得保证,并提供class作者以充分的实现弹性。★protected并不比public更具封装性条款23 宁以non-member-non-friend替...
阅读全文
摘要:条款20 宁以pass-by-reference-to-const替换pass-by-value记住:★尽量以pass-by-reference-to-const替换pass-by-value。前者通常高效,并可避免切割问题★以上规则并不适用于内置类型,以及STL的迭代器和函数对象。那些应用pass...
阅读全文
摘要:条款18 让接口容易被正确使用,不易被误用记住:★“促进正确使用”的办法包括接口的一致性,以及与内置类型的行为兼容★“阻止误用”的办法包括建立新类型、限制类型上的操作,束缚对象值,以及消除客户的资源管理责任(即类的设计者应先发制人)。★tr1::shared_ptr支持定制型删除器。这可防范DLL问...
阅读全文
摘要:条款16 成对使用new和delete时要采取相同形式记住:★若你在new表达式中使用[ ],必须在相应的delete中也使用[ ],反之亦然------------------------------------------------------------------当结合typedef使用时...
阅读全文
摘要:条款13 以对象管理资源记住:★为防止资源泄漏,请使用RAII对象,它们在构造函数中获得资源并在析构函数中释放★两个常被使用的RAII classes分别是tr1::shared_ptr和auto_ptr。前者通常是较佳选择,∵其copy行为比较直观。若选择auto_ptr,复制动作会使它(被复制物...
阅读全文
摘要:记住:★copying函数应确保复制“对象内的所有成员变量”及“所有base class成分”★不要尝试以某个copying函数实现另一个copying函数。应该将共同机能放进第三个函数中,并由两个copying函数共同调用--------------------------------------...
阅读全文
摘要:记住:★确保当对象自我赋值时operator=有良好行为。有三种方法:比较“来源对象”和“目标对象”的地址、精心周到的语句顺序、以及copy-and-swap技术★确定任何函数若操作一个以上对象,而其中多个对象是同一个对象时,其行为仍然正确------------------------------...
阅读全文
摘要:条款9 绝不在构造和析构过程中调用virtual函数记住: ★在构造和析构期间不要调用virtual函数,∵这类调用从不下降至derived class-------------------------------------------------------------------------...
阅读全文
摘要:条款8 别让异常逃离析构函数记住: ★析构函数绝对不要吐出异常。若一个被析构函数调用的函数可能抛出异常,析构函数应该捕捉任何异常,然后吞下它们(不传播)或结束程序。 ★若客户需对某个操作函数运行期间抛出的异常做出反应,那么class应提供一个普通函数(而非在析构函数)执行该操作。--------...
阅读全文
摘要:条款5:了解C++默默编写并调用哪些函数记住:★编译器可以(仅仅是可以,并非必须,仅当程序中有这样的用法时才会这么做!!!)暗自为class创建default构造函数,copy构造函数,copy assignment操作符以及析构函数。--------------------------------...
阅读全文
摘要:条款4:确定对象被使用前已先被初始化记住: ★为内置对象进行手工初始化,因为C++不保证初始他们 ★构造函数最好使用初始化列表,而不要在构造函数本体内使用赋值操作。初始化列表列出的成员变量,其排列次序应和它们在class中的声明次序相同 ★为免除“跨编译单元之初始化次序”问题,请以local ...
阅读全文
摘要:条款1:视C++为一个语言联邦记住: ★C++高效编程守则视状况而变化,这取决于你使用C++的哪一部分 C; Object-oriented c++; Template c++; STL条款2:尽量以const,enum,inline替换#define记住: ★对于单纯常...
阅读全文



浙公网安备 33010602011771号