C++中的存储类及其实例

文章目录

    • 0. 语法
    • 1. 自动存储类
      • 自动存储类对象的属性
      • 自动存储类的例子
    • 2. 外部存储类
      • extern存储类对象的属性
      • extern存储类的例子
    • 3. 静态存储类
      • 静态存储类的属性
      • 静态存储类的例子
    • 4. 寄存器存储类
      • 寄存器存储类对象的属性
      • 寄存器存储类例子
    • 5. 可变(mutable)存储类
      • 可变存储类的属性
      • 可变存储类的例子
    • 6. thread_local存储类
      • thread_local存储类属性
      • thread_local存储类的例子

C++存储类用于描述变量/函数的特性。它确定了生命周期、可见性、默认值和存储位置,这有助于我们在程序运行时跟踪特定变量。存储类说明符用于指定变量的存储类。

0. 语法

要指定变量的存储类,请遵循以下语法:

storage_class var_data_type var_name;

C++使用了6个存储类,如下所示:

  1. auto Storage Class
  2. register Storage Class
  3. extern Storage Class
  4. static Storage Class
  5. mutable Storage Class
  6. thread_local Storage Class

在这里插入图片描述
以下是对每个存储类的详细说明:

1. 自动存储类

自动存储类是块内声明的所有变量的默认类。auto 代表自动,块中声明的所有局部变量都自动属于此类。

自动存储类对象的属性

  • 范围:本地/局部
  • 默认值:垃圾值
  • 内存位置:RAM
  • 生命期:直到其范围结束

自动存储类的例子

// C++ Program to illustrate the auto storage class
// variables
#include <iostream>
using namespace std;

void autoStorageClass()
{

	cout << "Demonstrating auto class\n";

	// Declaring an auto variable
	int a = 32;
	float b = 3.2;
	char* c = "GeeksforGeeks";
	char d = 'G';

	// printing the auto variables
	cout << a << " \n";
	cout << b << " \n";
	cout << c << " \n";
	cout << d << " \n";
}

int main()
{
	// To demonstrate auto Storage Class
	autoStorageClass();

	return 0;
}

输出

Demonstrating auto class
32 
3.2 
GeeksforGeeks 
G 

注意:在C++早期,我们可以使用auto关键字显式声明自动变量,但在C++11之后,auto关键字的含义发生了变化,我们不能再使用它来定义自动变量。

2. 外部存储类

extern存储类只是简单地告诉我们变量是在其他地方定义的,而不是在使用它的同一块中(即外部链接)。基本上,该值在不同的块中被赋值,也可以在不同的块中重写/更改。外部变量只不过是一个全局变量,该全局变量在声明时使用合法值初始化,以便在其他地方使用。

在任何函数/块中的声明/定义之前放置 “extern” 关键字,可以将普通全局变量设置为 extern。使用外部变量的主要目的是,可以在大型程序的两个不同文件之间访问它们。

extern存储类对象的属性

  • 范围:全局
  • 默认值:0
    • 内存位置:RAM
  • 生命期:直到程序结束

extern存储类的例子

// C++ Program to illustrate the extern storage class
#include <iostream>
using namespace std;

// declaring the variable which is to
// be made extern an initial value can
// also be initialized to x
int x;
void externStorageClass()
{

	cout << "Demonstrating extern class\n";

	// telling the compiler that the variable
	// x is an extern variable and has been
	// defined elsewhere (above the main
	// function)
	extern int x;

	// printing the extern variables 'x'
	cout << "Value of the variable 'x'"
		<< "declared, as extern: " << x << "\n";

	// value of extern variable x modified
	x = 2;

	// printing the modified values of
	// extern variables 'x'
	cout << "Modified value of the variable 'x'"
		<< " declared as extern: \n"
		<< x;
}

int main()
{

	// To demonstrate extern Storage Class
	externStorageClass();

	return 0;
}

输出

Demonstrating extern class
Value of the variable 'x'declared, as extern: 0
Modified value of the variable 'x' declared as extern: 
2

有关外部变量如何工作的更多信息,请查看此链接。

3. 静态存储类

静态存储类用于声明在C++语言中编写程序时常用的静态变量。静态变量具有即使在超出其作用域后也能保留其值的特性!因此,静态变量保存了它们在作用域中最后一次使用的值。

我们可以说,它们只初始化一次,并且一直存在到程序终止。因此,没有分配新的内存,因为它们没有被重新声明。全局静态变量可以在程序中的任何位置访问。

静态存储类的属性

  • 范围:本地/局部
  • 默认值:0
    • 内存位置:RAM
  • 生命期:直到程序结束

注意:全局静态变量可以在任何函数中访问。

静态存储类的例子

// C++ program to illustrate the static storage class
// objects
#include <iostream>
using namespace std;

// Function containing static variables
// memory is retained during execution
int staticFun()
{
	cout << "For static variables: ";
	static int count = 0;
	count++;
	return count;
}

// Function containing non-static variables
// memory is destroyed
int nonStaticFun()
{
	cout << "For Non-Static variables: ";

	int count = 0;
	count++;
	return count;
}

int main()
{

	// Calling the static parts
	cout << staticFun() << "\n";
	cout << staticFun() << "\n";
	

	// Calling the non-static parts

	cout << nonStaticFun() << "\n";
	
	cout << nonStaticFun() << "\n";
	
	return 0;
}

输出

For static variables: 1
For static variables: 2
For Non-Static variables: 1
For Non-Static variables: 1

4. 寄存器存储类

寄存器存储类使用“register”关键字声明寄存器变量,该关键字具有与自动变量相同的功能。唯一的区别是,如果有可用的寄存器,编译器会尝试将这些变量存储在微处理器的寄存器中。这使得程序运行时,寄存器变量的使用比存储在内存中的变量的使用快得多。如果没有可用寄存器,则这些寄存器变量仅存储在内存中。

这里需要注意的一个重要而有趣的点是,我们不能使用指针来获得寄存器变量的地址。

寄存器存储类对象的属性

  • 范围:本地/局部
  • 默认值:垃圾值
    • 内存位置:CPU中的寄存器或RAM
  • 生命期:直到其范围结束

寄存器存储类例子

// C++ Program to illustrate the use of register variables
#include <iostream>
using namespace std;

void registerStorageClass()
{

	cout << "Demonstrating register class\n";

	// declaring a register variable
	register char b = 'G';

	// printing the register variable 'b'
	cout << "Value of the variable 'b'"
		<< " declared as register: " << b;
}
int main()
{

	// To demonstrate register Storage Class
	registerStorageClass();
	return 0;
}

输出

Demonstrating register class
Value of the variable 'b' declared as register: G

注意register关键字在C++17以后的版本中已被弃用。

5. 可变(mutable)存储类

有时需要通过const函数修改类/结构体的一个或多个数据成员,即使您不希望该函数更新类/结构体中的其他成员。使用mutable关键字可以很容易地执行此任务。关键字mutable主要用于允许修改const对象的特定数据成员。

当我们将函数声明为const时,传递给函数的指针就变成了const。给变量添加mutable可以让const指针改变成员。

可变存储类的属性

可变说明符不影响对象的链接或生存期。它将与在该位置声明的正常对象相同。

可变存储类的例子

// C++ program to illustrate the use of mutalbe storage
// class specifiers
#include <iostream>
using std::cout;

class Test {
public:
	int x;

	// defining mutable variable y
	// now this can be modified
	mutable int y;

	Test()
	{
		x = 4;
		y = 10;
	}
};

int main()
{
	// t1 is set to constant
	const Test t1;

	// trying to change the value
	t1.y = 20;
	cout << t1.y;

	// Uncommenting below lines
	// will throw error
	// t1.x = 8;
	// cout << t1.x;
	return 0;
}

输出

20

6. thread_local存储类

thread_local存储类是在C++11中添加的新存储类。我们可以使用thread_local存储类说明符将对象定义为thread_local。thread_local变量可以与其他存储说明符(如static或extern)组合,thread_local对象的属性也会相应更改。

thread_local存储类属性

  • 内存位置:RAM
  • 生命期:直到它的线程结束

thread_local存储类的例子

// C++ program to illustrate the use of thread_local storage
// sprecifier
#include <iostream>
#include <thread>
using namespace std;

// defining thread local variable
thread_local int var = 10;

// driver code
int main()
{
	// thread 1
	thread th1([]() {
		cout << "Thread 1 var Value: " << (var += 18) << '\n';
	});

	// thread 2
	thread th2([]() {
		cout << "Thread 2 var Value: " << (var += 7) << '\n';
	});

	// thread 3
	thread th3([]() {
		cout << "Thread 3 var Value: " << (var += 13) << '\n';
	});

	th1.join();
	th2.join();
	th3.join();

	return 0;
}

输出

Thread 1 var Value: 28
Thread 2 var Value: 17
Thread 3 var Value: 23

可以看到,每个线程都有自己的thread_local变量副本,并且只被分配了在其可调用文件中指定的值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/270900.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

iMazing2024免费版iOS移动设备管理软件

以自己的方式管理iPhone&#xff0c;让备受信赖的软件为您传输和保存音乐、消息、文件和数据。安全备份任何 iPhone、iPad 或 iPod touch。iMazing 功能强大、易于使用&#xff0c;称得上是 Mac 和 PC 上最好的 iOS 设备管理器。 正在为iTunes繁琐的操作发愁&#xff1f;设备数…

86% 的网络攻击是通过加密渠道进行

自 2022 年以来&#xff0c;HTTPS 威胁增长了 24%&#xff0c;凸显了针对加密通道的网络犯罪策略的复杂性。 制造业连续第二年成为最常受到攻击的行业&#xff0c;教育和政府组织的攻击同比增幅最高。此外&#xff0c;包括恶意 Web 内容和恶意软件负载在内的恶意软件继续主导其…

数字化转型是什么?有哪些应用?_光点科技

数字化转型是什么&#xff1f; 数字化转型是指企业或组织通过采用数字技术来改变其业务模式和运营方式&#xff0c;以适应新兴市场趋势、提高效率、增强客户体验和增加竞争优势的过程。它不仅涉及技术的变革&#xff0c;还包括企业文化、组织结构和业务流程的全面调整。数字化…

zookeeper基本使用

目录 环境搭建 单机版搭建 集群版搭建 基本语法使用 可视化客户端 数据结构 节点分类 1. 持久节点 2. 临时节点 3. 有序节点 4. 容器节点 5. TTL节点 节点状态 监听机制 watch监听 永久性watch 应用场景 1. 实现分布式锁 2. 乐观锁更新数据 应用场景总结 选…

docker安装MySQL8.0

1、从docker仓库中拉去mysql 8.0 docker pull mysql:8.0 2、查看是否拉取成功 docker images mysql:8.0 3、安装运行mysql8.0容器 docker run --name mysql8 -v /my/mysql/config:/etc/mysql/conf.d -v /my/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD123456 -p 3306…

《Spring Cloud学习笔记:Nacos配置管理 OpenFeign LoadBalancer Getway》

基于Feign的声明式远程调用&#xff08;代码更优雅&#xff09;&#xff0c;用它来去代替我们之前的RestTemplate方式的远程调用 1. Nacos配置管理 Nacos除了可以做注册中心&#xff0c;同样也可以做配置管理来使用。 利用Nacos实现统一配置管理以及配置的热更新&#xff1a;…

几种串口扩展电路

一、IIC串口扩展电路 LCT200 是一款可以通过 I2C 接口通讯&#xff0c;拓展 2 路独立串口的通讯芯片&#xff0c;同时也支持通过 2 路串口读写 I2C 接口的数据。LCT200 的封装为 TSSOP-20。 主要功能&#xff1a;⚫ 通过对 I2C 接口读写实现拓展 2 路独立串口功能 ⚫ 通过读写…

SpringBoot Event,事件驱动轻松实现业务解耦

什么是事件驱动 Spring 官方文档AWS Event Driven 简单来说事件驱动是一种行为型设计模式&#xff0c;通过建立一对多的依赖关系&#xff0c;使得当一个对象的状态发生变化时&#xff0c;所有依赖它的对象都能自动接收通知并更新。即将自身耦合的行为进行拆分&#xff0c;使拆…

AI安全综述

1、引言 AI安全这个话题&#xff0c;通常会引伸出来图像识别领域的对抗样本攻击。下面这张把“熊猫”变“猴子”的攻击样例应该都不陌生&#xff0c;包括很多照片/视频过人脸的演示也很多。 对抗样本的研究领域已经具备了一定的成熟性&#xff0c;有一系列的理论来论述对抗样本…

【JavaEE初阶二】 Thread类及常见方法

1. 线程的创建 主要来简单学习一下以下几种方法&#xff1a; 1.1 继承 Thread 类 具体代码见前面的一章节&#xff0c;主体的步骤有以下几部分&#xff1b; 1、继承 Thread 来创建一个自定义线程类MyThread class MyThread2 extends Thread{//重写run方法Overridepublic void …

VScode远程连接服务器,Pycharm专业版下载及远程连接(深度学习远程篇)

Visual Code、PyCharm专业版&#xff0c;本地和远程交互。 远程连接需要用到SSH协议的技术&#xff0c;常用的代码编辑器vscode 和 pycharm都有此类功能。社区版的pycharm是免费的&#xff0c;但是社区版不支持ssh连接服务器&#xff0c;只有专业版才可以&#xff0c;需要破解…

xlua源码分析(四) lua访问C#的值类型

xlua源码分析&#xff08;四&#xff09; lua访问C#的值类型 上一节我们主要探讨了C#是如何使用interface和delegate访问lua层的table和function的&#xff0c;本节我们跟着Examples 05_NoGc&#xff0c;来看看xlua是如何实现lua层无gc访问C#的值类型的。 首先例子中用到的lua…

在线快速获取UDID教程

第一步 进入UDID 登录咕噜分发官网(https://www.gulufenfa.com) 点击工具箱 进入控制台—【开发者工具】—【UDID】 第二步 获取UDID 进入UDID快速获取页面 因需要历史UDID所以需要登录您在咕噜分发的账号 用苹果手机扫描二维码根据操作UDID 第三步 手机操作教程 手机…

科技云报道:开源才是大模型的未来?

科技云报道原创。 一年前&#xff0c;ChatGPT横空出世&#xff1b;7个多月后&#xff0c;Meta宣布开源LLaMA 2&#xff0c;并且可免费商用。 这一天&#xff0c;也成为大模型发展的分水岭。短时间内&#xff0c;LLaMA 2对一些闭源的大模型厂商造成了致命性的打击。 随后&…

CGAL的三角曲面网格骨架化

1、介绍 马模型的曲线骨架。 骨架是用于分割、形状匹配、重建、虚拟导航等的有效形状抽象。顾名思义&#xff0c;曲线骨架是曲线结构的图&#xff08;1D&#xff09;。对于3D几何体来说&#xff0c;它不是由表面&#xff08;2D&#xff09;组成的中轴。如图所示&#xff0c;形…

VMvare虚拟机之文件夹共享防火墙设置

目录 一.jdk的配置&TomCat的配置 1.1 jdk配置 1.2 tomcat配置 二.文件夹共享功能 2.1 作用 2.2.高级共享和普通共享 三.防火墙设置 3.1 入站规则和出站规则 四.附图-思维导图 一.jdk的配置&TomCat的配置 建立一个共享文件夹&#xff0c;将jdk文件和tomcat文…

嵌入式——RTC内置实时时钟

学习目标 理解原理图RTC设计部分掌握初始化RTC掌握设置时间掌握读取时间学习内容 RTC原理图 RTC结构框图 RTC时钟 开发流程 加载依赖。gd32f4xx_rtc.c,gd32f4xx_pmu.c初始化RTC。时钟配置。获取时钟。RTC初始化 // 电池管理加载 rcu_periph_clock_enable(RCU_PMU); pmu_back…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Progress进度条组件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之Progress进度条组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、Progress组件 进度条也是UI开发最常用的组件之一&#xff0c;进度条组件…

分类预测 | Matlab实现SCSO-SVM基于沙猫群优化算法优化支持向量机的多变量分类预测【23年新算法】

分类预测 | Matlab实现SCSO-SVM基于沙猫群优化算法优化支持向量机的多变量分类预测【23年新算法】 目录 分类预测 | Matlab实现SCSO-SVM基于沙猫群优化算法优化支持向量机的多变量分类预测【23年新算法】分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现SCSO-…

docker部署kafka zookeeper模式集群

单机模式链接&#xff1a;https://blog.csdn.net/wsdhla/article/details/133032238 kraft集群模式链接&#xff1a;部署Kafka_kafka 部署-CSDN博客 zookeeper选举机制举例&#xff1a; 目前有5台服务器&#xff0c;每台服务器均没有数据&#xff0c;它们的编号分别是1,2,3,4,5…