1. Header(头文件)中的防卫式声明
complex.h
#ifndef __COMPLEX__
#define __COMPLEX__
...
#endif
2. constructor(ctor,构造函数)
complex (double r = 0, double i = 0): re (r), im (i) { }
尽量使用initialization list(初值列,初始列),而不是assignment(赋值)
3. const member functions(常量成员函数)
double real () const { return re; }
常量对象,以及常量对象的引用或指针都智能调用常量成员函数
4. 参数传递:pass by value vs. pass by reference(to const)
建议使用引用类型的形参替代指针
使用引用避免拷贝
拷贝大的类类型对象或者容器对象比较低效,甚至有的类类型(包括IO类型在内)根本就不支持拷贝操作,当某种类型不支持拷贝操作时,函数就只能通过引用形参访问该类型的对象当用实参初始化形参时会忽略掉顶层const。当形参有顶层const时,传给他常量对象或者非常量对象都是可以的
尽量使用常量引用
把函数不会改变的形参定义成(普通的)引用是一种比较常见的错误,这么做带给函数的调用者一种误导,即函数可以修改它的实参的值。此外,使用引用而非常量引用也会极大地限制函数所能接受的实参类型。比如我们不能把const对象、字面值或者需要类型转换的对象传递给普通的引用形参。
5. 返回值传递:return by vlaue vs. return by referencr(to const)
返回值不是local object,就可以return by reference
6. friend(友元)
类向外部提供其非共有成员访问权限的一种机制。友元的访问权限与成员函数一样。友元可以是类,也可以是函数
相同class的各个objects互为friends(友元)
7. operator overloading(操作符重载-1,成员函数) this
成员函数通过一个名为this的额外的隐式参数来访问调用它的那个对象。当我们调用一个成员函数时,用请求该函数的对象地址初始化this
当操作符重载函数作为类的成员函数时,操作符重载函数的参数会比作为友元或者独立于类的操作符重载函数少一个参数,因为操作符重载类成员函数把调用该函数的对象作为函数的第一个参数,也就是隐含的this指针指向调用该函数的第一个对象,所以会少一个参数。
必须作为类成员函数的运算符有:(),[],->和任何赋值运算符,重载这些运算符时必须把操作符函数声明为类的成员函数
8. operator overloading(操作符重载-2,非成员函数) (无this)
为了应对某一操作符的多种用法,需要分别进行重载
重载限制
- 并不是所有的操作符都能被重载。除了. ,.* ,:: ,? : ,sizeof,typeid这几个运算符不能被重载,其他运算符都能被重载
- 重载不能改变该运算符用于内置类型时的函义,程序员不能改变运算符+用于两个int型时的含义
- 运算符函数的参数至少有一个必须是类的对象或者类的对象的引用。这种规定可以防止程序员运用运算符改变内置类型的函义。
- 重载不能改变运算符的优先级
- 重载不能改变运算符的结合律
- 重载不能改变运算符操作数的个数。比如+需要两个操作数,则重载的+也必须要有两个操作数。