C++沉思录读书笔记
抽象是有选择的忽略,编程也依赖于一种选择,选择忽略什么、何时忽略。编程就是通过建立抽象来忽略那些我们此刻并不重视的因素。
在使用你的程序时,如果因为不遵守规则而导致工作失败,大部分人不会反躬自省,而会怪罪到你头上。
第四章 类设计者的核查表
- 你的类需要一个构造函数吗?
- 你的数据成员是私有的吗?
- 你的类需要一个无参的构造函数吗?
- 是不是每个构造函数初始化所有的数据成员?
- 类需要析构函数吗?
- 你的类需要虚析构函数吗?
- 你的类需要复制构造函数吗?
- 你的类需要一个赋值操作符吗?
- 你的赋值操作符能正确的将对象赋给对象本身吗?
- 你的类需要定义关系操作符吗?
- 记得在复制构造函数和赋值操作符的参数类型加上const了吗? 复制构造函数不会改变原对象,实际上绑定一个非const引用到一个临时的对象是非法的,使用X::X(X&)作为复制构造函数不会允许复制任何特殊表达式的结果。同样的道理也适用于赋值:使用X::operator=(const X&), 而不是X:operator=(X&).
- 如果有引用参数,它们应该是const引用吗?
- 只有函数想改变参数时,它才应该有不用const声明的引用参数。
- 记得适当地声明成员函数为const了吗?
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
class X { public: X(){} // 如果没有默认构造函数,则 X a;报错 X(X&) { cout << "cp ctr" << endl; } }; X getX() { X temp; return temp; } int main() { X a; X c(getX());// error: cannot bind non - const lvalue reference of type 'X&' to an //rvalue of type 'X' return 0; }
定义名为代理surrogate的对象,代理运行起来和它所代表的对象基本相同,但是允许将整个派生层次压缩在一个对象类型中。