《Effective C++ Third Edition》的原文摘录

  • 1. “促进正确使用”的方法包括接口的一致性,以及与内置类型的行为兼容。 2. “阻止误用”的方法包括建立新类型、限制类型上的操作,束缚对象值,以及消除客户的资源管理责任。 3. 使用shared_ptr支持定制型删除器;也可以用来自动解除互斥锁。 (查看原文)
    feynman 1赞 2015-01-06 22:17:03
    —— 引自章节:第四章 设计与声明
  • Class的设计就是type的设计 。重载函数和操作符、控制内存的分配和归还、定义对象的初始化和总结。。。 (查看原文)
    feynman 1赞 2015-01-06 22:17:03
    —— 引自章节:第四章 设计与声明
  • 前者更为高效,并可避免切割问题(slicing problem)。切割问题:当一个derived class对象以by value方式传递并被视为一个base class对象,base class的copy 构造函数会被调用,而derived class的那些特化性质全部被切割了。 该规则并不适用于内置类型,以及STL的迭代器和函数对象。对于它们而言,pass-by-value往往比较合适。 (查看原文)
    feynman 1赞 2015-01-06 22:17:03
    —— 引自章节:第四章 设计与声明
  • 绝不要反悔pointer或reference指向一个local stack对象,或反悔一个heap-allocated对象,或反悔pointer或reference指向一个local static对象而有可能同时需要多个这样的对象。 (查看原文)
    feynman 1赞 2015-01-06 22:17:03
    —— 引自章节:第四章 设计与声明
  • 一致性。这样客户就不需在打算访问class成员时迷惑地记住是否改用小括号。 如果有一个public变量,而我们最终取消了它,有可能会影响到所有使用到它的代码。而取消protect变量,只会影响到使用它的derived class。所以最好使用private封装变量。 (查看原文)
    feynman 1赞 2015-01-06 22:17:03
    —— 引自章节:第四章 设计与声明
  • 这样可以增加封装性、包裹弹性和机能扩充性。 (查看原文)
    feynman 1赞 2015-01-06 22:17:03
    —— 引自章节:第四章 设计与声明
  • 考虑接口为: const Rational operator*(const Rational& rhs) const; Rational oneFouth(1, 4); Rational result = oneFouth * 2; // 能编译通过 result = 2 * oneFouth; //不能编译通过 (查看原文)
    feynman 1赞 2015-01-06 22:17:03
    —— 引自章节:第四章 设计与声明
  • Rational result = oneFouth.operator*( 2 ); // 很好 result = 2.operator*(oneFouth); // 错误 (查看原文)
    feynman 1赞 2015-01-06 22:17:03
    —— 引自章节:第四章 设计与声明
  • const Rational operator*(const Rational& lhs, const Rational& rhs) const; (查看原文)
    feynman 1赞 2015-01-06 22:17:03
    —— 引自章节:第四章 设计与声明
  • 当std::swap对你的类型效率不高时,提供一个swap成员函数,并确定这个函数不抛出异常。 (查看原文)
    feynman 1赞 2015-01-06 22:17:03
    —— 引自章节:第四章 设计与声明
  • 如果提供一个member swap,也该提供一个non-member swap来调用前者。对于class(而非templates),也请特化std::swap。 调用swap时,应针对std::swap使用using声明式,然后调用swap并且不带任何“命名空间资格修饰”。 为“用户定义类型”进行std templates全特化是好的,但千万不要尝试在std内加入某些对std而言全新的东西。 (查看原文)
    feynman 1赞 2015-01-06 22:17:03
    —— 引自章节:第四章 设计与声明
  • classes not designed to be base classes or not designed to be used polymorphically should not declare virtual destructors (查看原文)
    邻家の躺平人 2011-07-02 22:57:50
    —— 引自章节:item 7
  • With this altered design, clients can read the Points defining a rectangle, but they can't write them. This means that declaring upperLeft and upperRight as const is no longer a lie, because they no longer allow callers to modify the state of the object (查看原文)
    邻家の躺平人 2011-08-26 16:55:41
    —— 引自章节:item 28
  • 这意味着当初声明upperLef和upperRight为const不再是个谎言 (查看原文)
    邻家の躺平人 2011-08-26 16:57:44
    —— 引自第125页
  • Warn about violations of the following style guidelines from Scott Meyers’ Effective C++ book: * Item 11: Define a copy constructor and an assignment operator for classes with dynamically allocated memory. * Item 12: Prefer initialization to assignment in constructors. * Item 14: Make destructors virtual in base classes. * Item 15: Have "operator=" return a reference to *this. * Item 23: Don’t try to return a reference when you must return an object. Also warn about violations of the following style guidelines from Scott Meyers’ More Effective C++ book: * Item 6: Distinguish between prefix and postfix forms of increment and decrement operators. * Item 7: Never overload "&&", "││", or ",". When selecting this option, be aware that the standard library headers do not obey all of these g... (查看原文)
    [已注销] 4回复 1赞 2012-01-15 17:37:14
    —— 引自第1页
  • 1)如果某些东西被封装,它就不再可见,愈多东西被封装,愈少人可以看到它,而愈少人看到它,我们就有愈大的弹性去变化它,因为我们的改变仅仅直接影响看到改变的那些人事物。因此,愈多东西被封装,我们改变那些东西的能力也就愈大。 2)太快定义变量可能造成效率上的拖延; 过度使用转型可能导致代码变慢又难以维护,又招来微妙难解的错误; 返回对象的handles可能会破坏封装并留给客户dangling handles; 未考虑异常带来的冲击则可能导致资源泄漏和数据败坏; 过度热心的inlining可能引起代码膨胀; 过度耦合导致让人不满意的冗长构建时间; 3)public继承 Liskov Substituion Principle 任何base class可以派上用场的地方,derived class也可以派上用场, 能够施行于base class的每件事情,也可以施行于derived class对象身上 4)接口继承和实现继承 pure virtual function可以有定义 5)Non-Virtual Interface(NVI手法,Template Method模式) 接口为non-virtual,但提供一个private的virtual function作为实现,由接口调用此private实现 derived class需要重新定义继承而来的但并不主动调用的private virtual function 6)私有继承 如果classes之间的继承关系是private,编译器不会自动讲一个derived class对象转换为一个base class对象。 private继承可以使Empty Base Optimization (EBO)最... (查看原文)
    流云 2012-02-13 15:21:24
    —— 引自章节:继承与面向对象设计
  • 如果const出现在星号左边,那么被指物是常量。出现在右边,指针本身是常量。 (查看原文)
    [已注销] 2012-07-18 23:37:00
    —— 引自第18页
  • RAII (查看原文)
    [已注销] 1回复 2012-07-19 23:34:36
    —— 引自第68页
  • 如果classes的一个赋值成本低于一组构造+析构,A大体而言比较高校。尤其当n值很大的时候。否则B或许较好。此外A造成名称w的作用域比B更大,有时对程序的可理解性和易维护性造成冲突。因此除非①你知道赋值成本比“构造+析构”低,②你正在处理代码中效率高度敏感的部分,否则你应该使用做法B。 (查看原文)
    [已注销] 2012-07-22 20:36:25
    —— 引自第113页
  • 一旦程序员领悟了pass-by-value(传值)的效率牵连层面(见条款20),往往变成十字军战士,一心一意根除pass-by-value带来的种种邪恶。 (查看原文)
    HuyoUSiTa 2013-07-09 09:20:56
    —— 引自第90页
<前页 1 2 后页>