1.const
作用:将变量定义为常量,用于防止意外修改,增强程序的健壮性;和static一样,修饰全局变量使其仅在当前文件中可见;
const
修饰普通变量时必须在定义时初始化。
const
修饰指针时:
const int* p1; //常量指针
int* const p2; //指针常量
const int* const p3; //指向常量的常指针
1.常量指针,不能通过解引用来修改变量的值,但可以通过修改指针指向其他地址来修改;
2.指针常量,指针所指的地址是不能修改的,但可以通过解引用对其重新赋值来达到修改的目的;
3.指向常量的常指针,无论是地址还是指针所指的值都不能修改。
const
修饰函数时:
1.修饰函数的参数时,一般表示改值为传入参数,函数体内不能进行修改;
2.修饰函数的返回值时,用于限制函数的返回值当左值使用;
3.const成员函数,该const是用于修饰this指针的,即函数体内禁止修改对象的数据。
2.static
修饰局部变量时,使得该变量在静态存储区分配内存;其生命周期与程序相同,但作用域为局部作用域,并不能一直被访问;只能在函数首次被调用时进行初始化,之后的函数调用不再进行初始化。
修饰全局变量时,使得该变量在静态存储区分配内存;该全局变量仅在本文件中可见,在文件外是不可见的。
修饰函数时,该函数仅在本文件中是可见的,在文件外是不可见的,可以解决在多人协作时函数命名冲突的问题。
修饰成员变量时,所有对象只维持一份拷贝,可以实现不同对象之间的数据共享;无需实例化对象即可访问;不能在类内进行初始化,一般在类外进行初始化,并且初始化时无需添加static
关键字。
修饰成员函数时,该函数不接受this指针,只能访问类的静态成员;无需实例化对象即可访问。
注:静态存储区所有未初始化和初始化的变量存储在不同的区域。
int a;
int b = 1;
static int c;
static int d = 1;
int main() {
static int e;
static int f = 1;
cout << &a << endl; //0058A46C
cout << &b << endl; //0058A034
cout << &c << endl; //0058A470
cout << &d << endl; //0058A038
cout << &e << endl; //0058A474
cout << &f << endl; //0058A03C
return 0;
}
3.extern
extern
用来说明此变量/函数是在别处定义的,此处仅进行声名。
static
和 extern
不可同时出现。
4.explicit
explicit
只能用于修饰只有一个参数的构造函数,若该构造函数包含多个参数,那么除第一个参数外,其他参数都必须有默认值。
explicit
关键字的作用是防止类构造函数的隐式自动转换。
注:隐式类型转换:可以用单个形参来调用的构造函数定义了从形参类型到该类类型的一个隐式转换。
class A{
public:
A(int n){}
};
A a = 10; //此处会发生隐式类型转发
class B{
public:
explicit B(int n){}
};
B b = 10; //若使用explicit修饰后会报错
5.inline
inline
是将函数展开,把函数的代码复制到每一个调用处。而不发生跳转,压栈等操作,可以节省时间并提升程序的执行速度。inline
仅是给编译器一个建议。
inline
仅适合函数体内代码比较简单的函数使用,不能包含复杂的结构控制语句。函数内的代码也不宜较长,否则容易导致内存消耗代价较高。
inline
和define
的区别:
1.inline
在编译时展开,define
在预处理时展开;
2.inline
是一种函数,会进行严格的类型检查,而define
不会进行类型检查,只是做简单的替换;
3.inline
不允许出现复杂的语句,若使用了复杂的语句则不一定会被展开,而define
对此不做要求且一定会展开。
6.register
register
用于建议编译器将频繁使用的变量保存在寄存器中来提升程序的运行速度。
register
变量必须是能被CPU所接受的类型。通常意味着register
变量必须是一个单个的值,并且长度应该小于等于整形的长度。
register
变量可能不存放在内存中,所以不能使用&
来获取变量的地址。
欢迎评论区留言扩充、纠错或更新更多关键字。