随笔分类 -  Effective C++

摘要:APIs往往要求访问原始资源(raw resources),所以每一个RAII class应该提供一个“取得其所管理之资源”的办法。 对原始资源的访问可能经由显示转换(.get()成员函数或者指针取值操作符->,*)或隐式转换(提供隐式转换函数)。一般而言显示转换比较安全,但隐式转换对客户比较方便。 阅读全文
posted @ 2015-01-31 21:03 智者无惧 阅读(128) 评论(0) 推荐(0)
摘要:复制RAII对象必须一并复制它所管理的资源,所以资源的copying行为决定RAII对象的copying行为。 普遍而常见的RAII class copying行为是:抑制copying(使用私有继承Uncopyable)、施行引用计数法(reference counting)(即std::tr1: 阅读全文
posted @ 2015-01-31 10:38 智者无惧 阅读(138) 评论(0) 推荐(0)
摘要:为防止资源泄漏,请使用RAII(Resource Acquisiton Is Initialization) 对象,它们在构造函数中获得资源并在析构函数中释放资源。 两个常被使用的RAII classes 分别是tr1::shared_ptr和auto_ptr。前者通常是较佳选择,因为其copy行为 阅读全文
posted @ 2015-01-30 21:16 智者无惧 阅读(124) 评论(0) 推荐(0)
摘要:Copying函数应该确保复制“对象内的所有成员变量”及“所有base class成分”。 不要尝试以某个copying函数实现另一个copying函数。应该将共同机能放进第三个函数中,并由两个coping函数共同调用。如果你发现你的copy构造函数和copy assignment操作符有相近的代码 阅读全文
posted @ 2015-01-30 11:34 智者无惧 阅读(116) 评论(0) 推荐(0)
摘要:确保当对象自我赋值时operator=有良好行为。其中技术包括比较“来源 对象”和“目标对象”的地址、精心周到的语句顺序、以及copy-and-swap. 确定任何函数如果操作一个以上的对象,而其中多个对象是同一个对象时,其行为仍然正确。 阅读全文
posted @ 2015-01-30 10:29 智者无惧 阅读(121) 评论(0) 推荐(0)
摘要:比如: Widget& operator=(const Widget& rhs) { ... return* this; } 令赋值(assignment)操作符返回一个reference to *this 阅读全文
posted @ 2015-01-29 17:44 智者无惧 阅读(105) 评论(0) 推荐(0)
摘要:在构造和析构期间不要调用virtual函数,因为这类调用从不下降至derived class(比起当前执行构造函数和析构函数的那层)。 阅读全文
posted @ 2015-01-29 17:30 智者无惧 阅读(104) 评论(0) 推荐(0)
摘要:析构函数绝对不要吐出异常。如果一个被析构函数调用的函数可能抛出异常,析构函数应该捕捉任何异常,然后吞下它们(不传播)或结束程序。 如果客户需要对某个操作函数运行期间抛出的异常作出反应,那么class应该提供一个普通函数(而非在析构函数中)执行该操作。 阅读全文
posted @ 2015-01-29 11:48 智者无惧 阅读(102) 评论(0) 推荐(0)
摘要:polymorphic(带多态性质的)base classes应该声明一个virtual析构函数。如果class带有任何virtual函数,它就应该拥有一个virtual析构函数。 Classes的设计目的如果不是作为base classes使用,或不是为了具备多态性(polymorphically 阅读全文
posted @ 2015-01-27 17:50 智者无惧 阅读(107) 评论(0) 推荐(0)
摘要:为驳回编译器自动提供的功能,可将相应的成员函数声明为private并且不予实现。 使用像Uncopyable这样的base class也是一种做法(即先声明一个基类,然后私有继承它)。这其实有点像使用Boost提供的版本,那个class名为noncopyable。 阅读全文
posted @ 2015-01-22 11:59 智者无惧 阅读(104) 评论(0) 推荐(0)
摘要:面对“内含reference成员或者含const成员”的class内支持赋值操作,你必须自己定义copy assignment操作符。 如果某个base classes将copy assignment操作符声明为private,编译器将拒绝为其derived classes 生成一个copy ass 阅读全文
posted @ 2015-01-22 11:25 智者无惧 阅读(129) 评论(0) 推荐(0)
摘要:为内置型对象进行手工初始化,因为C++不保证初始化它们。 构造函数最好使用成员初值列,而不要在构造函数本体内使用赋值操作。初值列列出的成员变量,其排列次序应该和它们在class中的声明次序相同。 为免除“跨编译单元之初始化次序”问题,请以local static对象替换non-local stati 阅读全文
posted @ 2015-01-19 16:30 智者无惧 阅读(109) 评论(0) 推荐(0)
摘要:如果关键字const出现在星号左边,表示被指物是常量;如果出现在星号右边,表示指针自身是常量;如果出现在星号两边,表示被指物和指针两者都是常量。 char greeting[] = " hello"; char* p = greeting; //non-const pointer,non-const 阅读全文
posted @ 2015-01-17 11:47 智者无惧 阅读(190) 评论(0) 推荐(0)
摘要:class GamePlayer{private: static const int NumTurns = 5; int scores[NumTurns]; ...}; 万一你的编译器(错误地)不允许“static整数型class常量“完成”in class初值设定“,可改用所谓的”the enum 阅读全文
posted @ 2015-01-17 11:19 智者无惧 阅读(120) 评论(0) 推荐(0)