题记:有时候知道为什么,就会理解这些规则,进而深刻体会。编程思想是值得看的书
- 拷贝构造函数:X(X&)。因为拷贝构造函数正是为了解决按值传递的问题,必须不能按值传递,而是使用引用。将拷贝构造函数申明为私有的可以防止按值传递。(java为什么没有拷贝构造函数?)
- 指向成员函数的指针:objectPointer->*pointerToMember和object.*pointerToMember
- 运算符重载 operator@。对于二元预算符,唯一的参数是出现在运算符右侧的操作数
- 返回值优化:return Interger(left.i + right.i); 和 Integer tmp(left.i + right.i); reutrn tmp;是完全不同的
- 重载函数原型
// prefix 返回一个可以改变的引用,为了保持一致,也可以设置为const friend Object& operator++(Object& a); // postfix 返回值是一个临时变量,所以是不可以改变的。同理,加法的返回值也是临时对象,应该设置为const frined const Object operator++(Object& a, int); // 输出 friend ostream& operator<<(ostream& os, const Object& ob); //输入 friend istream& operator>>(istream& is, Object& ob);
- 成员和非成员的基本方针:如果没有区别,尽量使用成员,强调运算符和类的联合。如果左操作数不属于本类,则只能使用友元。operator=强制为成员函数。全局运算符重载相对于成员函数重载的好处在于全局版本允许在全局版本自动类型转换时可以针对于左右任一操作数,而成员函数版本的必须保证左操作数处于正确的形式,考虑 1 + ObjectA
- 自动类型转换:构造函数转换(可以加关键字explicit阻止构造函数自动转换问题);运算符转换 operator WhantedClass() const {return WhatedClass();}
- 动态对象创建:用new比malloc高级的是不仅申请空间,还调用构造函数,保证了正确的初始化。用new申请的空间要用delete来释放,而不是free,这样析构函数才会调用。