Static关键字:
1. 修饰对象:可以修饰变量,也可以修饰函数
2. 使用场景:
函数体类:在函数体类定义一个静态变量(如,static A),则该变量只能在函数体类访问,且只初始化一次;
模块内:主要是避免命名重复。在源文件内声明,作用域只限定在该文件内部,可避免多个源文件定义相同函数或者变量冲突问题;在头文件中声明,那么所有包含该头文件的源文件都可以访问该编码或者函数。
3. 类中修饰:可以修饰成员函数和成员变量。
静态成员函数和静态成员变量都属于整个类所拥有。静态成员函数是不接受this指针的,也就是说在静态成员函数不能访问类对象的非静态成员(函数、变量),静态成员函数只能访问静态成员变量。
Const关键字:
1. 定义变量:
在C语言中,定义局部和全局const变量,其中局部的const变量是在栈上分配的,可以通过指针去修改,而全局const变量是在静态全局中分配的,不可以修改,若尝试使用指针去修改该值都是未定义的行为,会报段错误;在C++语言中,会把所有用const修饰的变量加载到符号表中,每次访问该值的时候都是从符号表中获取的,所以也就不能用指针修改该变量的值(允许修改但是无法修改成功)。
使用const定义变量的作用:避免修改、避免内存的多次分配、类型和作用域的检查。
如: #define VAR 20 int a = VAR int b = VAR
Const int VAR_EX = 20 int a = VAR_EX int b = VAR_EX
宏和const都可以避免变量被修改,但是宏在赋值a和b是分配了两次20的空间,而const只分配了一次内存空间,另外宏定义不能直观的定义变量类型,是一种弱类型,而const在定义时就已经明确变量的类型了。
修饰指针变量:离谁近则修饰谁的原则
Const char *ptr; 指针常量,指针的内容不能修改
Char * const ptr; 常量指针,指针的地址不能修改
2. 修饰函数参数:不允许修改函数的参数
3. 修饰函数返回值:避免做左值,返回值不允许修改,如c++运算符重载返回值
4. 类中const常成员函数(如:void fun()const):
确保不修改成员变量,只能调用类的const成员变量和const成员函数,const对像(或者叫只读对象)只能调用const常成员函数,不能调用非const成员函数,因为非const成员函数可能会去修改成员变量,而非const对象可以访问任意成员函数;
可用于函数重载,如:
Class B{
Void fun () const;
Void fun();
}
B b; b.fun();//调用的是Void fun () ;
const B b1; b1.fun(); //调用的是Void fun () const;