c++之存储类

2023-05-16

C++ 存储类

存储类定义 C++ 程序中变量/函数的范围(可见性)和生命周期。这些说明符放置在它们所修饰的类型之前。下面列出 C++ 程序中可用的存储类:

  • auto
  • register
  • static
  • extern
  • mutable
  • thread_local (C++11)

从 C++ 11 开始,auto 关键字不再是 C++ 存储类说明符,且 register 关键字被弃用。

auto 存储类

自 C++ 11 以来,auto 关键字用于两种情况:声明变量时根据初始化表达式自动推断该变量的类型、声明函数时函数返回值的占位符。

C++98标准中auto关键字用于自动变量的声明,但由于使用极少且多余,在C++11中已删除这一用法。

根据初始化表达式自动推断被声明的变量的类型,如:

auto f = 3 .14 ; //double
auto s ( " hello " ) ; //const char*
auto z = new auto ( 9 ) ; // int*
auto x1 = 5 , x2 = 5 .0 , x3 =' r '; //错误,必须是初始化为同一类型

register 存储类

register 存储类用于定义存储在寄存器中而不是 RAM 中的局部变量。这意味着变量的最大尺寸等于寄存器的大小(通常是一个词),且不能对它应用一元的 '&' 运算符(因为它没有内存位置)。

{
register int miles ;
}

寄存器只用于需要快速访问的变量,比如计数器。还应注意的是,定义 'register' 并不意味着变量将被存储在寄存器中,它意味着变量可能存储在寄存器中,这取决于硬件和实现的限制。

static 存储类

static 存储类指示编译器在程序的生命周期内保持局部变量的存在,而不需要在每次它进入和离开作用域时进行创建和销毁。因此,使用 static 修饰局部变量可以在函数调用之间保持局部变量的值。

static 修饰符也可以应用于全局变量。当 static 修饰全局变量时,会使变量的作用域限制在声明它的文件内。

在 C++ 中,当 static 用在类数据成员上时,会导致仅有一个该成员的副本被类的所有对象共享。

实例

#include < iostream >  
// 函数声明 
void func ( void ) ;
static int count = 10 ; /* 全局变量 */  
int main ( )
{
while ( count -- )
{
func ( ) ;
}  
 
return 0 ;
}
// 函数定义
void func ( void )
{
static int i = 5 ; // 局部静态变量
i ++;
std :: cout << " 变量 i 为 " << i ;
std :: cout << " , 变量 count 为 " << count << std :: endl ;
}

当上面的代码被编译和执行时,它会产生下列结果:


变量 i  6 , 变量 count  9
变量 i  7 , 变量 count  8
变量 i  8 , 变量 count  7
变量 i  9 , 变量 count  6
变量 i  10 , 变量 count  5
变量 i  11 , 变量 count  4
变量 i  12 , 变量 count  3
变量 i  13 , 变量 count  2
变量 i  14 , 变量 count  1
变量 i  15 , 变量 count  0  

extern 存储类

extern 存储类用于提供一个全局变量的引用,全局变量对所有的程序文件都是可见的。当您使用 'extern' 时,对于无法初始化的变量,会把变量名指向一个之前定义过的存储位置。

当您有多个文件且定义了一个可以在其他文件中使用的全局变量或函数时,可以在其他文件中使用 extern 来得到已定义的变量或函数的引用。可以这么理解,extern 是用来在另一个文件中声明一个全局变量或函数。

extern 修饰符通常用于当有两个或多个文件共享相同的全局变量或函数的时候,如下所示:

第一个文件:main.cpp

实例

#include < iostream >
int count ;
extern void write_extern ( ) ;
int main ( )
{
count = 5 ;
write_extern ( ) ;
}

第二个文件:support.cpp

实例

#include < iostream >
extern int count
void write_extern ( void )
{
std :: cout << " Count is " << count << std :: endl ;
}

在这里,第二个文件中的 extern 关键字用于声明已经在第一个文件 main.cpp 中定义的 count。现在 ,编译这两个文件,如下所示:


$ g++ main.cpp support.cpp -o write  

这会产生 write 可执行程序,尝试执行 write,它会产生下列结果:


$ ./write
Count is 5  

mutable 存储类

mutable 说明符仅适用于类的对象,这将在本教程的最后进行讲解。它允许对象的成员替代常量。也就是说,mutable 成员可以通过 const 成员函数修改。

thread_local 存储类

使用 thread_local 说明符声明的变量仅可在它在其上创建的线程上访问。 变量在创建线程时创建,并在销毁线程时销毁。 每个线程都有其自己的变量副本。

thread_local 说明符可以与 static 或 extern 合并。

可以将 thread_local 仅应用于数据声明和定义,thread_local 不能用于函数声明或定义。

以下演示了可以被声明为 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 ; // 本地变量
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c++之存储类 的相关文章

  • 困惑多年,为什么printf可以重定向?

    很多人在用printf函数进行串口打印的时候 xff0c 都会被告知需要重定向fputc函数 xff08 别的平台可能不是这个函数 xff09 xff0c 让字符串数据输出到指定串口 xff0c 按照网上的教程也能很快解决 但是却没人告诉你
  • 多线程并发编程

    文章目录 多线程并发编程一 多线程带来的问题相关概念 二 互斥1 互斥与互斥量2 申请互斥量I 静态方法申请互斥量 xff1a II 动态方法申请互斥量 xff1a 3 利用互斥量加锁与解锁4 销毁互斥量5 互斥量综合应用 模拟抢票6 互斥
  • 【嵌入式】---- 串口UART波形分析

    串口参数的配置 波特率 xff08 bit s xff09 xff1a 大多数使用115200 但有些芯片特殊 xff0c 具体要看数据手册中波特率的容错率 比如中微的CMS32L051就不支持115200bps 停止位 xff1a 一般选
  • 手把手教你用JAVA实现“语音合成”功能(文字转声音)标贝科技

    手把手教你用JAVA实现 语音合成 功能 xff08 文字转声音 xff09 标贝科技 前言 什么是语音合成 xff1f 将文本转换成自然流畅的语音 xff0c 本篇文章将介绍 实时在线合成 xff08 文本长度不得超过1024字节 xff
  • cv::imread(cv::String const&, int)’未定义的引用

    在 Makefile文件的195 行 LIBRARIES 43 61 opencv core opencv highgui opencv imgproc 后面添加 xff1a opencv imgcodecs opencv videoio修
  • 【C/C++】C++ 网络多线程编程

    关键词 xff1a C C 43 43 网络编程 多线程 套接字 UDP 前言 学习C 43 43 网络编程多线程编程的目的 xff1a 巩固C 43 43 xff1b 由于C 43 43 大多用于服务器 xff0c 因此网络和多线程是进入
  • 在ubuntu20.04上配置VINS_Fusion(亲测有效,一应俱全)

    最近在做科研训练的时候配置了HKUST Aerial Robotics实验室的VINS Fusion代码项目 xff0c 经历了一些编译报错的问题 xff0c 在网上查找的时候博客内容良莠不齐 xff0c 且实质针对性意见不多 xff0c
  • 无人机项目跟踪记录二十五--无线接收模块的输入输出

    无线接收模块的功能是接收无线遥控器的命令 xff08 应该对应的是无人机上面的无线接收芯片 xff09 xff0c 无人机根据接收的指令进行不同的处理 用同样方法 xff0c 无线接收模块包含的函数是 xff1a Nrf Irq void
  • UDP校验和及代码

    UDP校验和采用反码求和 xff1a 两数相加 xff0c 把超出16位加入到第0位 校验和算法 unsigned short UDPCheck unsigned short data int len int carryBit 61 0 i
  • ROS Moveit:rviz和gazebo仿真出现rviz规划后gazebo没有反应

    在用rviz规划后 xff0c 警告 WARN 1649654675 728414350 42 937000000 Failed to validate trajectory couldn 39 t receive full current
  • Libcurl实现HTTP/HTTPS客户端(支持get、post、保持session)

    前面的文章 Libcurl编译指南 Android和Windows系统 已经就libcurl在Windows和Android系统编做了详细的说明 本文档用C C 43 43 实现简单的HTTP HTTPS客户端 xff0c 支持get和po
  • 基于uart的RS232和RS485总线

    我们之前讲uart的时候就已经提过一个问题 xff0c 就是它并不是直接连接到SOC里面的 xff0c 而是经过了一个芯片的转换 这个芯片的转换就是和我们要说的rs232 485总线有关的 RS232和RS485总线其实本质就是uart 只
  • c语言

    一 c基础 1 1 一个函数遇到return语句就终止了 1 2 system系统调用 xff1a 用命令打开计算器 记事本等 xff0c windows和linux下命令不同 xff0c 需要头文件 xff08 stdlib h xff0
  • [PTA]7-115 祝贺你成年了! (5 分)

    到了18岁 xff0c 你就成年了 xff01 请输入你的年龄 xff0c 如果大于等于18岁 xff0c 则输出 34 Congratulations 34 输入格式 输入一个不超过200的整数A 输出格式 按照要求输出 输入样例 18
  • 教你如何用ffmpeg处理音频格式转换(标贝科技)

    文章目录 前言ffmpeg介绍 xff1f 一 下载与安装1 下载安装包2 设置环境变量3 验证是否安装成功 二 命令讲解1 参数解释2 音频格式转换命令 三 标贝开放平台介绍 前言 ffmpeg介绍 xff1f FFmpeg是一套可以用来
  • cmake(十六)Cmake条件判断指令

    一 基础语法 基本框架 优先级 条件的类型 二 实践 项目初始化 CMakeLIsts txt 文件 字符串比较默认值 测试 补充 43 43 43 43 43 43 43 43 43 43 43 43 43 39 CMake 基本语法 3
  • 南通移动打造“5G+无人机”为乡村振兴插上“智慧翅膀”

    近年来 xff0c 南通通州移动按下5G 加速键 xff0c 探索智慧服务 xff0c 以信息化手段助力提升乡村治理现代化水平 xff0c 为打造数字乡村贡献数智力量 如今 xff0c 在南通通州区的二甲镇 xff0c 南通通州移动在二甲镇
  • 免费的在线影视网站汇总(包括图片,小说等)

    免费最新在线影视站 xff0c 仅用于测试用途 日常请使用 正版视频 软件 xff0c 支持正版人人有责 影视大全展开目录 萝莉岛 app少女美腿令你无限遐想大米星球蓝光福利免费在线站hdmoli免费高清 1080 影视站剧迷 tv免费无广
  • TI 杯2019年全国大学生电子设计竞赛题

    TI 杯2019年全国大学生电子设计竞赛赛题 2019 08 07 07 30 目录 TI 杯2019年全国大学生电子设计竞赛赛题 TI 杯2019年全国大学生电子设计竞赛题A 电动小车动态无线充电系统 TI 杯2019年全国大学生电子设计

随机推荐

  • C语言—字符指针作函数参数 按如下函数原型编程实现字符串连接函数strcat()的功能。void MyStrcat(char *dstStr, char *srcStr);

    按如下函数原型编程实现字符串连接函数strcat 的功能 void MyStrcat char dstStr char srcStr 输入提示信息 xff1a 34 Input a string 34 34 Input another st
  • frp错误,frp报错,[ssh] start error: proxy name [ssh] is already in use

    在linux开发板上 xff0c arm开发板上 xff0c 运行frp xff0c 报错 ssh start error proxy name ssh is already in use 原因是有其他的设备运行过 ssh 命名的子项 xf
  • ubuntu中共享文件夹看不到

    参考原文链接 xff1a https blog csdn net asia66 article details 80597531 utm medium 61 distribute pc relevant t0 none task blog
  • KEIL设置程序起始地址无效解决方法,STM32 IAP程序起始地址

    关键词 xff1a KEIL设置程序起始地址无效解决方法 STM32 IAP设置程序起始地址 KEIL设置程序起始地址 MDK设置程序起始地址 KEIL设置ROM地址无效 碰到的问题 xff1a 为了实现STM32升级固件 xff0c 需要
  • 电源滤波保护电路

    电源滤波保护电路 参考https wenku baidu com view 76c07ff0ba0d4a7302763a33 html X电容 xff0c 滤差模干扰 Y电容 xff0c 滤共模干扰 安规电容
  • Ubuntu安装yaml

    在Ubuntu下 xff0c 使用pip安装yaml pip install pyyaml 测试 xff1a gt gt gt import yaml gt gt gt 没报错 xff0c 说明安装成本 注 xff1a 我是在root下安装
  • 教你windows下配置java环境变量&idea配置maven库(标贝科技)

    配置java环境变量 43 idea配置maven库 xff08 标贝科技 xff09 前言 配置环境变量是小伙伴们入坑的第一步 xff0c 本文将一步一步详细介绍 xff0c 保证大家都能够看懂 xff01 xff01 xff01 顺便介
  • 廉价16bit音频DAC芯片TM8211(PT8211、TDA1311)

    推荐低成本高性能两路16位DAC 数模转换 芯片TM8211 xff08 PT8211 TDA1311 xff09 一 概述 xff1a TM8211是两路16位数模转换集成 电路 xff0c 可广泛应用于数字音频 多媒体系统 芯片采用CM
  • 基于累加的PDM算法的原理

    基于累加的 PDM 算法 的 原理 基于累加的 PDM 算法 2 PDM编码原理如下 xff1a 单片机能输出Sin t 吗 xff1f 能 xff0c DA 没有DA怎么办 xff1f PWM 没有PWM怎么办 xff1f 事情就是这么来
  • PCM音频压缩A-Law算法,uLaw

    参考相关 xff1a 关于pcm音频头与a law音频头的互换代码 http blog csdn net fjhyy article details 6593049 https baike baidu com item A E5 BE 8B
  • Spyder cell分块运行 run cell

    Spyder是一个使用方便的Python开发环境 xff0c 安装Anaconda时自带 python代码分块 xff1a 使用Spyder xff0c 可以在python文件 xff08 py xff09 里使用 In 进行分块 如下图
  • C语言中实现bool(布尔型变量)

    C语言中 xff0c 本身没有bool xff08 布尔型变量 xff09 但是我们可以用其他方式来模拟 一 如果简单的使用char int long变量来表示0 1 xff0c 则太浪费空间了 二 这里介绍一种巧妙的方式实现bool xf
  • 随机解调-多频点信号与伪随机序列混频

    随机解调的多频点信号x与伪随机序列经过混频后 xff0c 被均匀的涂抹到了整个频率轴上 xff0c 然后经低通滤波 xff0c 低速均匀采样 xff0c 最后通过OMP等算法恢复原始信号 xff0c 整体上是压缩感知求解欠定方程y 61 A
  • 寻路算法 Astar A星算法

    lt span style 61 34 white space pre 34 gt lt span gt lt span style 61 34 white space pre 34 gt lt span gt 首先是创建一些变量 lt p
  • eclipse调试C代码时printf()不能输出到控制台的解决方法

    1 问题 在ecplise下使用CDT开发C C 43 43 程序中 xff0c 使用debug调试时 xff0c 到了printf 打印函数 xff0c 在console窗口中并没有打印出信息来 xff0c 停止后才会有输出 2 原因 在
  • C语言中带参宏定义

    include lt stdio h gt 1 带参宏定义中 xff0c 宏名和形参表之间不能有空格出现 2 宏定义中不存在值传递 xff0c 它只是一个符号的替换过程 3 带参宏定义中 xff0c 形参不分配内存空间 xff0c 因此不必
  • kaldi新手入门及语音识别的流程(标贝科技)

    kaldi新手入门及语音识别的流程 标贝科技 欢迎体验标贝语音开放平台 地址 xff1a https ai data baker com source 61 qaz123 xff08 注 xff1a 填写邀请码hi25d7 xff0c 每日
  • 结构体字节对齐详解【含实例】

    一 前言 结构体字节对齐属于老生常谈的问题 xff0c 看似简单 xff0c 却很容易忘记 而且因为结构体使用的普遍性 xff0c 使得字节对齐也成为了一个不得不谈的话题 二 什么是结构体字节对齐 假设现在有一个结构体如下 xff0c 问你
  • Mina基础(五):编写自定义协议及编解码器

    为什么要制定协议呢 xff1f 我们知道 xff0c 底层传输的都是二进制数据 xff0c 服务端和客户端建立连接后进行数据的交互 xff0c 接受这对方发送来的消息 xff0c 如何判定发送的请求或者响应的数据结束了呢 xff1f 总不能
  • c++之存储类

    C 43 43 存储类 存储类定义 C 43 43 程序中变量 函数的范围 xff08 可见性 xff09 和生命周期 这些说明符放置在它们所修饰的类型之前 下面列出 C 43 43 程序中可用的存储类 xff1a autoregister