C++修饰符类型
1、static
静态存储修饰符:
修饰局部变量时,使变量只被初始化一次,并且变量生命周期延长至和当前进程一致。
修饰函数时,该函数只在当前文件中可见,调用权限只在当前文件。
修饰全局变量时,会使变量的作用域限制在声明它的文件内。
修饰类数据成员时,会导致仅有一个该成员的副本被类的所有对象共享。
// 局部变量 void valPp(void) { static int times = 0; std::cout << times++ << std::endl; } // 函数 static void fun(void){} // 全局变量 static int age = 0; // 类内成员变量 class Base { private: int a; static int b; };
2、const
常量类型修饰符:
修饰变量时,使该变量不可被更改。
const int value = 0;
修饰函数的指针类型形参时,使该指针指向的内容不可被更改。
int FunTion(const int *value);
修饰类的成员函数时,使该函数不能修改类的成员变量。
class Base { private: string name; int age; private: void MyPrint()const; };
3、mutable
可变对象修饰符:
修饰类内成员变量时,可以让带有const修饰的函数修改该成员变量。
class Base { private: string name; int age; mutable int printTimes; private: void MyPrint()const; };
4、restrict
限制访问修饰符:
修饰某块内存的指针时,限制这块内存只能通过该指针访问;
char * restrict name = (char *)malloc(256);
例如memcpy可能出现内存重叠问题,例如s1访问长度过长已经达到了s2所指向的内存区域,可能出现问题。
若没有restrict就不会有这个限制。
void * memcpy(void * restrict s1, const void * restrict s2, size_t n); void * memmove(void * s1, const void * s2, size_t n);
5、volatile
易变变量修饰符
修饰变量时,使变量不会被编译优化(相当于告诉编译器此变量可能会被其他的外部因素改变,如硬件或其他线程)
volatile int num = 20;
6、register
寄存器变量修饰符
修饰变量时,期望编译后会吧把该变量放在CPU的寄存器中,以便频繁调用节省时间开销。
void example_function(register int num) { // register 关键字建议编译器将变量 num 存储在寄存器中 // 以提高程序执行速度 // 但是实际上是否会存储在寄存器中由编译器决定 }
7、thread_local
线程副本变量修饰符
修饰某个线程中自己的副本变量,该副本变量生命周期与线程相同,只能在线程内访问。
不嫩用于函数声明或定义。
thread_local int x; // 命名空间下的全局变量 class X { static thread_local std::string s; // 类的static成员变量 }; static thread_local std::string X::s; // X::s 是需要定义的 void foo() { thread_local std::vector<int> v; // 本地变量 }