1、防御式声明
#ifndef _COMPLEX_
#define _COMPLEX_
...
#endif
作用:保证只include一次
2、inline function 在body内进行定义
更快,但最终能否inline由编译器决定
3、为什么应该用初始化列表
complex(double r=0, double i=0) : re(r), im(i)
{
}
两个阶段:初始化和赋值阶段,如果写在body里面,就放弃了初始化阶段,直接到赋值。这样效率就会降低。
4、尽量所有的参数传递都传引用,不要传值。返回值也尽量传引用。 (---侯捷)
如果不希望被改变,加const func(const complex&)
什么情况下返回值不能用引用:当函数结束后,引用的东西就消亡了,这种情况下,返回值就不能是引用。
如果返回的值,不是在函数体中创建的,返回的时候就可以传引用
5、使用友元函数可以直接使用private数据,而不是友元,需要定义专门的函数才能拿到private的数据。
相同class的各个objects互为friends(友元)
******************************************总结**********************************************
1、数据一定是private
2、参数尽可能以reference传递,加不加const,看情况
3、返回值也尽量用reference。加不加const,看情况
4、应该加const的地方就应该加const,否则可能会编译报错
5、尽量使用初始化列表
所谓stack(栈),所谓heap(堆)
Stack,是存在于某作用域(scope)的一块内存空间(memory space)。例如当你调用函数,函数本身即会形成一个stack用来放置它所接收的参数,以及返回地址。在函数体内声明的任何变量,其所使用的内存块都取自上述stack。 如 Complex c1(1, 2)
Heap,或称为system heap,是指由操作系统提供的一块global内存空间,程序自动分配(dynamic allocated)从中获得若干块(blocks)Complex* p = new Complex(3)
从栈中获得的空间,当作用域结束,空间就会被自动释放。从堆中获得的空间,必须手动释放;
static object,其生命在作用域(scope)结束之后仍然存在,直到整个程序结束。
global object,其生命在整个程序结束之后才结束。
---侯老师说其他地方没有这两页ppt,所以保存下来(^V^)