c++ 存储说明符以及cv限定符总结

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》

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值