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;  // 本地变量
}

 

posted on 2023-11-08 11:49  _燃灯续昼  阅读(51)  评论(0编辑  收藏  举报

导航