关键字
const
- 修饰变量:该变量不能修改
- 修饰引用:不能通过该引用修改其引用的对象
- 修饰指针:
- 指向常量的指针:const TYPE* pointer,不能通过该pointer修改其指向的对象;
- 指针常量:TYPE* const pointer,不能修改该pointer本身;
- 修饰成员函数:TYPE func() const,该函数不能修改类内的任何成员变量
static
修改变量的存储区域和生命周期,使变量存储在静态区
- 修饰普通变量、普通函数:约束作用范围在本文件内的全局,不能被其它文件访问(加了extern关键字也不行);在修饰变量的时候,只执行初始化一次;
- 修饰类成员:静态成员属于类,无需实例化对象便可访问ClassName::StaticMember,被所有类对象共用
- 静态类成员变量:使用前必须显式初始化;
- 静态类成员函数:只能访问静态成员、而不能访问非静态成员。
https://www.runoob.com/w3cnote/cpp-static-usage.html
inline
内联函数,建议编译器直接把内联函数中的内容复制到了调用该函数的地方,以减少函数调用开销
- 不能包含循环、递归、switch 等复杂操作;内联只是对编译器的建议,是否内联取决于编译器
- 定义在类中的函数,除了虚函数,都会自动隐式地当成内联函数。但这不代表虚函数无法内联
volatile
表明所修饰变量不稳定、易变,禁止编译器优化该变量(每次必须从内存中读取该变量的值);一般情况下,如果两次读取变量之间,没有修改该变量的值,第二次读取的时候是直接使用上一次读到的内容(从cpu寄存器中读取、而非内存中读取);但是在多线程中,两次读取之间,可能会被其它线程修改,但读取的还是旧内容。
https://www.runoob.com/w3cnote/c-volatile-keyword.html
thread_local
线程局部存储,每个线程都有一个副本,相互不影响,在线程内只会被初始化一次、生命周期绑定到线程的生命周期(类似于static)
https://www.jianshu.com/p/8df45004bbcb
struct、class
默认的访问和继承权限不同:struct默认都是public的,class默认都是private的
union
联合体,其所有成员共享内存空间(大小等于各成员空间大小的最大值)
联合体里面的东西共享内存,所以静态、引用都不能用,因为它们不可能共享内存;不允许存放带有构造函数、析构函数、复制拷贝操作符等的类,因为共享内存、编译器无法保证这些对象不被破坏,也无法保证离开时调用析构函数
https://blog.csdn.net/lincyang/article/details/6176642
enum
枚举变量的值只能取枚举常量表中所列的值,就是整型数的一个子集;枚举变量占用内存的大小与整型数相同。
enum color_set1 {RED, BLUE, WHITE, BLACK} color1;
//color1=1非法,不能直接将常量赋给枚举变量;color1=RED;
enum color_set2 { GREEN, RED, YELLOW, WHITE} color3;
//color1=color3非法,不同类型的枚举变量之间不能相互赋值
https://www.runoob.com/w3cnote/cpp-enum-intro.html