const
-------------->
(距离谁近修饰谁)
- const修饰变量
- 变量不可变,必须在声明时就被初始化
- const修饰指针
- const* int a; // 指针指向的变量不可变
- const int * a; // 指针指向的变量不可变
- int * const; // 指针指向的地址不可变
- int * const * a; // 指针指向的变量和地址都不可变
- const修饰函数参数
- 被修饰的参数在函数内不能被改变
- const修饰函数返回值
- 与修饰变量差不多
- const修饰成员变量
- 成员变量不可变,必须在初始化列表中初始化
- const修饰成员函数
- 成员函数不能改变任何成员变量,且只能调用const成员函数
- const修饰对象、指针、引用
- 被const修饰的对象不能改变任何成员变量,只能调用const成员函数。
- const的优点
- 编译器类型检查
- 相对于#define会分配内存节省空间,编译器给出const变量地址,只有一份拷贝,而#define有n份拷贝。
- 提高效率,编译器将const变量保存在符号表中,避免了读写内存的操作。
- const的底层实现
- 在C语言中,const 变量被视为只读变量。可通过指针对其值进行改变。
- C++中,对于内置类型,会视为常量,保存在符号表中。不可通过指针对其进行改变。
static
- 修饰局部变量
- 改变存储位置,使其存储到静态区,不改变作用域
- 改变生命周期,只在当前函数可见
- 没有初始化则默认初始化为0,只被初始化一次
- 修饰全局变量
- 改变作用域,其他文件不可见,不改变存储位置
- 默认初始化为0,
- 不同文件可以有相同的静态全局变量名
- 修饰函数
- 作用域为当前文件,其他文件不可见
- 修饰成员变量
- 类的所有对象共享变量,只被初始化一次
- 修饰成员函数
- 可被访问修饰符修饰
- 只能访问类的静态变量和静态函数
volatile
- volatile的本意是指:这个值可能会在当前线程外部被改变。
- volatile的作用是作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值。volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。
register
- register修饰符暗示编译程序相应的变量将被频繁的使用,应将其保存在CPU的寄存器中,以加快其存储速度。
- register变量必须是一个单个的值,并且长度应该小于或等于整型的长度。
- register变量不可能存放在内存中,所以不能使用“&”来获取该变量地址。
- 只有局部变量和形参可作为register变量,其他(如全局变量)不行。
- 静态局部变量不能定义为register变量
- 不能定义多个寄存器变量。
exten “C”
- extern "C"的主要作用就是为了能够正确实现C++代码调用其他C语言代码。
- 加上extern "C"后,会指示编译器这部分代码按C语言的进行编译,而不是C++的。
- 由于C++支持函数重载,因此编译器编译函数的过程中会将函数的参数类型也加到编译后的代码中,而不仅仅是函数名;
- 而C语言并不支持函数重载,因此编译C语言代码的函数时不会带上函数的参数类型,一般之包括函数名。