Exceptional C++ 学习笔记
时间:2011-01-04 来源:苹果君
1尽可能地使用标准库中的类而不是自己编写
2为单参数构造函数加上explicit修饰
3 const Complex operator+(constComplex& other)
4 实现某个运算符的同时,最好实现与此运算符相应的赋值运算符,并且使用后者来实现前者。
5 operator+ 不应该是成员函数,应该是友元函数。
6 必须将 =,(),[],->运算符定义为成员函数,new,new[],delete,delete[]等定义为静态成员函数。
operator>>或者operator<<或者需要对做操作数进行类型转换,应该为非成员函数,最好是友元函数。或者如果可以通过类的公有接口实现,都应该设为非成员函数。
这种情况下如果要求运算符需要有虚函数的行为,那么通过调用类中的虚成员函数来实现,由虚成员函数实现虚函数行为。
7 ostream&operator<<(ostream& os, const Complex&);
8 Complex& operator++();
9 const Complex operator++(int);
Ex21 对虚函数进行重载
重载:相同作用域中才会发生。
覆盖:子类的函数名跟父类的函数名相同。
隐藏:相同的名字会使外层的作用域的函数被隐藏。
重写:虚函数的重写,一定要一模一样(名字跟参数签名)才会重写。
Ex22 类之间的关系
在基类中没有虚函数是此类不应该被公有继承的强烈提示。
在基类中没有保护成员是此类不应该被继承的强烈提示,包括公有继承和私有继承。
当一个类的实现需要依靠另外一个类的时候(也就是重用另外一个类的代码),优先选择使用组合方式。(只有涉及到保护成员的时候,才使用私有继承,Ex24有更加详细的描述)
Ex24 继承的使用和误用
使用非公有继承的情况
1 需要对基类的虚函数进行重写
2 需要访问基类的保护成员
3 需要在使用类之前构造被使用类,或者需要使用类析构之后才析构被使用类,简单地说就是需要被使用类的生命周期长于使用类。比如说,在被使用类中有用到锁机制,例如临界区等。
4
5 从空基类中得到的好处:编译器会对空基类进行优化。
6 保护继承有时候也可以塑模出is-a关系,就是访问基类的函数是友元函数或者成员函数的时候。(其实非公有继承不能塑模出is-a关系的根本原因就是外部函数收到访问限制)
不使用公有继承的情况
1 可以使用非公有继承的时候。
2 不是is-a 或者works-like-a关系。