Const
const代表不可更改,和kotlin中const类似。
一般用法:
const int i = 0; |
普通变量申明在顶层中,可以被其他文件访问。const只可以被本文件中的函数访问,可以使用extern来访问其他文件中的const变量。
指针与const:
指针与const配合使用有几种不同的情况
- const在前,修饰数据类型
const int *ptr; |
不可以直接操作*ptr,但是可以将非const类型对象地址赋值给const类型数据指针。
- 和上面一样
int const *ptr; |
- const修饰指针,指针地址一旦赋值就不可改变,成为常指针
int * const ptr2; |
- const数据类型对的const指针:
const int* const ptr3 = &i; |
函数与const
我们通常在函数参数中加入const,用来保证函数不会修改参数值。
- const修饰返回值
const int fun(){ |
- const修饰参数:
void fun2(const int i){ |
关于函数参数使用引用还是指针:
非基础数类型(自定义结构体)作为参数的时候,函数内部会创建临时的数据对象,会经过构造-复制-析构过程,非常消耗性能,所以传递引用,避免性能消耗,同时使用const避免修改源数据
void fun(const A &a){ |
Static
静态变量在程序生命周期中只分配一次,其分配在单独的空间中。如果一个类中有静态变量,其经过了多次创建,多个对象会共享一个静态变量。
静态对象贯穿程序的生命周期。
在类中有静态变量,可以不用初始化该类,直接使用::
使用:
class Apple |
static配合const:
static const int ijk = 123; |
static初始化时机:
类中的static变量必须在类外面初始化,不能直接初始化:
class Box |
Volatile
在java中volatile修饰变量,表示该变量只存在一个引用,被所有线程共享,线程栈内存中不存储该变量的副本。
cpp中的作用与之类似,在多线程共享同一变量的时候,使用volatile修饰方式编译器优化把变量内存装入cpu寄存器,每一次读写都是该变量的真正内存地址。
常见问题:
- volatile和const可以用时修饰吗?
可以
- volatile和static可以同时修饰吗?
可以
- volatile和const、static可以用时修饰吗?
可以
|
指针也可以被volatile修饰,但是并不常见。