c++中的存储说明符种类如下:
- auto
- register
- static
- extern
- thread_local
- mutable
cv限定符有:
- const
- volatile
下面详细说一下功能
auto:
在c++11之前用来表示变量是一种自动型的变量,其存储的生命周期为一个函数或者代码块里,若不显式定义,默认为自动存储变量。
而在c++11之后,auto被用作自动判别数据类型。
例如以下代码(c++11标准及以上):
int a=1,b=2;
auto c=a+b;//c被判断为int
int x=1;
double y=1.2;
auto z=x+y;//z被判断为double
map<int,int>mp;
auto it=mp.begin();//it被判断为map<int,int>iterator
register:
在c++11之前被定义为寄存器存储变量,使得访问和操作变量的速度更快。
而在c++11被定义为显式表示变量是一种自动存储变量(同c++11之前定义的auto)。
static:
表示静态存储变量,只要定义过一次,便永久存储(直到程序结束),但是只能在一个函数体和代码块或者一个文件中使用。可以用来记录调用函数的次数、类创建对象的个数(不能在类的声明里直接初始化值,需要在外部初始化值)。若在全局变量前加static,则只能在文件中使用。
用来记录函数调用次数代码:
#include<bits/stdc++.h>
using namespace std;
int fun(int a)
{
static int b=0;
b++;
if(a<0)
return 0;
else
fun(a-1);
return b;
}
int main()
{
cout<<fun(5)<<endl;
return 0;
}
最后输出为7,说明一共调用了7次fun(5,4,3,2,1,0,-1)函数。
extern:
用extern说明变量需要在其他文件中查找,而这个extern只是一个声明而已,并没有创建一个内存单元来保存变量。
thread_local:
c++11新增说明符,其存储变量的周期为一个线程,多用于多线程运作的程序。
mutable:
用于结构体或类声明中,用于表示即使整个结构体或者类对象是被const限定了的,但是mutable说明的成员变量依然可以被改变。
代码如下:
struct Preson
{
string name;
mutable int age;
};
const Preson a{"jack",18};
cout<<a.name<<' '<<a.age<<endl;
a.age=19;
cout<<a.age<<endl;
最后输出结果为
jack 18
19
以上代码中对象a的成员中name由于const对a的限制,所以改变不了,但是age由于mutable的声明所以可以进行改变。在结构体声明中去掉mutable则不能编译通过。
const限定符:
const的使用比较广泛,可以用来定义常量,表示声明一种不可被修改的变量。
volatile限定符:
volatile限定符与const刚好相反,表示变量是容易变化的,即上一步赋值后,在下一步取值时不再是上一步的赋的值,经常用在嵌入式开发中,例如用变量来表示信号,而信号容易发生变化。
参考文献:
《c++ primer plus》