define的生命周期止于编译器,预处理的时候就替换了。
const的作用:
(1)用于常量,编译器可以对其进行数据静态类型安全检查。
(2)void fun(A a);
void fun(A const &a);引用传递不产生临时对象,节省了临时对象的构造、复制、析构过程。必须加const因为函数结束后不对a进行改变.通过将引用变量用作形参,不带const函数将使用原始数据而不是其副本,除指针外,引用也为函数处理大型数据结构提供了一种方便的途径。如果程序员的意图是让函数使用传递给他的信息而不对这些信息进行修改同时又想使用引用则应使用const引用
(3)const char *getchar(void) {};
char * ch = getchar();//error
const char *ch = getchar();//correct
(4)int getcount(void) const;//任何不会修改数据成员的成员函数都应用const修饰、
static的作用:
(1)在函数体中一个变量被声明为static,多次调用这个函数这个变量的值一直保持着上一次的结果
(2)在模块内但在函数体外,一个被声明为静态的变量可以被这一模块内的所有函数访问,但不能被模块外的其他函数访问。
(3)在模块内,一个被声明为静态的函数只可被这一模块内的其他函数调用,那就是这个函数被限制在声明他的模块的本地范围内使用
(4)在C++中,类中的静态成员和方法不属于类的实例,而属于类本身并在所有类的实例间共享。
(5)static函数在内存中只有一份,普通函数在每个被调用中维持一份复制品。
inline:
执行到函数调用指令时,程序将在函数调用后立即存储该指令的内存地址,并将函数参数复制到堆栈,跳转到标记函数起点的内存单元,执行函数代码,然后调回地址被保存的指令处,来回跳跃并记录跳跃位置意味着以前使用函数时需要一定得开销。
对于inline函数,编译器将使用相应的函数代码来替换函数调用。
对于inline函数,程序无需调到一个位置再跳回来,如果程序在10个不同的地方调用同一个内联函数,则该程序将包含该函数代码的10个副本,如果代码执行时间很短,则inline调用就可以节省非内联调用的使用的大部分时间。由于该过程相当快,因此尽管节省了该过程的大部分时间,但节省的时间绝对值并不大除非该函数经常被调用
必须在函数声明和函数定义前加关键字inline
inline是以代码膨胀为代价的,仅仅省去了函数调用的开销,从而提高了效率
inline函数是在编译时展开,而宏是在预编译时展开。内联函数可以被直接镶嵌在目标代码中。
在类中一般将数据成员定义为私有的或者保护的,这样外界就不会直接读写我们的类成员的数据了。私有或者保护成员的读写就必须使用成员接口函数来进行,如果我们把这些读写成员函数定义成内联函数的话,将会获得比较好的效率
volatile:
一个定义为volatile的变量可能会发生意想不到的改变,编译器不会去假设这个值了。精确的说,就是优化器在用到这个变量的时候必须每次小心的重新读取这个变量的值,而不是使用保存在寄存器中的备份。
(1)并行设备的硬件寄存器(比如状态寄存器)
(2)一个中断服务子程序中会访问到的非自动变量
(3)多线程应用中被几个任务共享的变量