P13 C++ 类 | 结构体内部的静态static
目录
01 前言
02 类内部创建静态变量的例子
03 在类的内部创建静态变量的作用
04 最后的话
01 前言
本期我们讨论 static 在一个类或一个结构体中的具体情况。
在几乎所有面向对象的语言中,静态在一个类中意味着特定的东西。这意味着在类的所有实例中,这个变量只有一个实例。如果我创建一个名为 Entity 的类,然后不断创建 Entity 实例,我仍然只会得到那个变量的一个版本。相对应的,如果某个实例改变了这个静态变量,它会在所有实例中反映这个变化。
正因为如此,通过类实例来引用静态变量是没有意义的。因为这就像是类的全局实例。
静态方法也是一样,无法访问类的实例。静态方法不需要通过类的实例就可以被调用。而在静态方法内部,你不能写引用到类实例的代码,因为你不能引用类的实例。
02 类内部创建静态变量的例子
让我们来看一下例子。
#include <iostream>
using namespace std;
class Dog
{
public:int age;const char *name;void print(){cout <<name<<": "<<age << endl;}
};int main()
{Dog dog;dog.age = 10;dog.name = "xiaohuan";Dog dog2 = {15,"xiaobai"};dog.print();dog2.print();return 0;
}
在这里我写一个叫做 Dog 类,一个整形变量age,一个常量指针name。
我们现在有一个非常简单的基类。并且实例化它,将其值设置为我们想要的值。
我想创建这个类的另一个实例,我也可以用第二种方法,然后用初始化器来完成初始化。
然后我们给了 Dog类的一个方法 Print。让两个实例分别调用 Print。
运行之后可以看到,结果很清楚,并没有什么问题。

如果我让变量变为静态的话,事情就会有些不一样了。
首先出现问题的地方是第二种初始化方法,x 和 y 变成静态的话,这样的初始化操作会失败,因为 x 和 y 不再是类成员。

我们先修改一下它。
我们有两个不同的实例,至少看起来是这样的。
如果我们运行代码,我们会得到一个错误。

编译器会告诉我们未定义变量,这是因为我们需要在某个地方定义那些静态变量。
我们可以这样操作。

现在链接器器可以连接到合适的变量了。
然后我们运行代码。
你会看到我们实际上打印了两次 一样的数据,结果有点奇怪。
我们回去看代码,首先我们在第一个实例上的设定了 10,xiaohuan。第二个为 12 和 xiaobai。然而你要记得,当 age 和 name 变成静态时,我们让这两个变量在 Entity 类的所有实例中只有一个实例。这意味着当我改变第二个 Dog实例的 x 和 y时,它们实际上和第一个完全是一样的,他们指向的是相同的内存。
没错,两个不同的 Dog实例,他们的 age 和 name指向同一个地方。这时候你就会明白,我们这样这样引用是没有意义的。

当然,如果让变量静态化之后,也可以这样初始化
就像我们在名为 Dog的命名空间中创建了两个变量,它们实际上并不属于类。
从严格意义上说它们可以是私有的,它们仍然是类的一部分,而不是命名空间的一部分。
但是无论出于何种目的,当你创建一个新的类的实例或类似的东西时,他们其实和在命名空间中是一样的。与如何分配无关。
03 在类的内部创建静态变量的作用
那么,这样做的意义是什么?
这当然很有用,当你想要跨类使用变量时,你可以使用一个静态全局变量而不使用全局变量,它是在内部进行链接的。不会在你这整个项目都是全局的。
那你为什么要这么做呢?答案是把他们放在 类中是有意义的。
举个例子,比如你想创建一个日志报表Log,其中有一条信息。你想要在所有的实例之间的共享数据。这时候将它存储在类中是有意义的,因为它与 Log有关。
要组织好代码,那你最好在这个类中创建一个静态变量,而不是一些静态的或全局的东西到处乱放。静态方法的工作方式与此类似,如果我让这个 Print 方法变成静态,它是会正常工作的。

看上述代码,我们在Log类中创建了一个messas字符串,然后我们在主函数将其初始化,初始化完将messags打印出来,很好,我们说过在类内部定义静态变量,其实所有的实例之间的数据数据是共享的,然后再在类的外部定义一个函数,在函数内将类的messags进行修改,最后在主函数打印出来。
04 最后的话
我希望我把相关的内容都讲清楚了。下期我们看看如何将许多的 static 知识整合了到我们一直在研究的 log 类中,看看那会变成是什么样子。
你可以先去看一下如何写一个 C++ 类那期。随着系列的进行,我们会继续增加 log 类的内容,并发掘一些我们可以做的新事情,并在学习新概念的同时不断改进它。
好了,记住,static 对于那些静态数据非常有用,这些数据不会在类实例之间发生变化。
本期的内容就是这些,下期再见。
Dog类相关代码
#include <iostream>
using namespace std;
class Dog
{
public:static int age;static const char *name;static void print(){cout <<name<<": "<<age << endl;}
};static void print(Dog dog) //也可以这样使用类的静态变量
{cout <<dog.name<<": "<<dog.age << endl;
}int Dog::age; //定义变量,不然对象并不能找到定义,因为static相当于在类中能认识,但类的范围外并不认识
const char* Dog::name;class Log
{char *messages;
};int main()
{Dog dog;dog.age = 10;dog.name = "xiaohuan";//Dog dog2;Dog::age = 12;Dog::name = "xiaobiao";dog.print();//dog2.print();return 0;
}
Log 相关代码
#include <iostream>
using namespace std;
class Log
{
public:static string messages;static void print() //如果变量为非静态的话,则需要将类传进出,Log s ,s.messages{std::cout<< messages<<std::endl;}
};void print()
{Log::messages = "this is from nothing funtion message";
}
string Log::messages;int main()
{Log::messages = "this is a test form main";Log::print();print();Log::print();return 0;
}
相关文章:
P13 C++ 类 | 结构体内部的静态static
目录 01 前言 02 类内部创建静态变量的例子 03 在类的内部创建静态变量的作用 04 最后的话 01 前言 本期我们讨论 static 在一个类或一个结构体中的具体情况。 在几乎所有面向对象的语言中,静态在一个类中意味着特定的东西。这意味着在类的所有实例中ÿ…...
【腾讯云云上实验室-向量数据库】Tencent Cloud VectorDB在实战项目中替换Milvus测试
为什么尝试使用Tencent Cloud VectorDB替换Milvus向量库? 亮点:Tencent Cloud VectorDB支持Embedding,免去自己搭建模型的负担(搭建一个生产环境的模型实在耗费精力和体力)。 腾讯云向量数据库是什么? 腾…...
git clone -mirror 和 git clone 的区别
目录 前言两则区别git clone --mirrorgit clone 获取到的文件有什么不同瘦身仓库如何选择结语开源项目 前言 Git是一款强大的版本控制系统,通过Git可以方便地管理代码的版本和协作开发。在使用Git时,常见的操作之一就是通过git clone命令将远程仓库克隆…...
基于51单片机的公交自动报站系统
**单片机设计介绍, 基于51单片机的公交自动报站系统 文章目录 一 概要公交自动报站系统概述工作原理应用与优势 二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 很高兴为您介绍基于51单片机的公交自动报站系统: 公交自动报…...
NextJS开发:Image组件的使用及缺陷
Next.js 中的 Image 组件相比于传统的 img 标签有以下几个优点: 懒加载:Image 组件自带懒加载,当页面滚动到 Image 组件所在位置时才会加载图片,从而加快页面的渲染速度。自动优化:Image 组件会自动将图片压缩、转换格…...
网络安全面试经历
2023-11-22 X亭安全服务实习生面试 一面: 工作方向:偏蓝队 总结:实习蓝队面试没有什么难度,没有什么技术上的细节问题,之前准备的细节问题没有考 最后和面试官聊了聊对网安的认识,聊了聊二进制的知识…...
Rust语言入门教程(四) - 数据类型
标量类型(Scalar Types) 在Rust中,一共有4中标量类型, 也就是基本数据类型,分别是: 整型(Integers)浮点型(Floats)布尔型(Boolean)字符型(Chara…...
华为云人工智能入门级开发者认证学习笔记
人工智能入门级开发者认证 人工智能定义 定义 人工智能 (Artificial Intelligence) 是研究、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。 强人工智能 vs 弱人工智能 强人工智能:强人工智能观点认为有可能制造出真正能推理(…...
腾讯云发布新一代基于AMD处理器的星星海云服务器实例SA5
基础设施的硬实力,愈发成为云厂商的核心竞争力。 11月24日,腾讯云发布了全新一代星星海服务器。基于自研服务器的高密设计与硬件升级,对应云服务器SA5是全球首家搭载第四代AMD EPYC处理器(Bergamo)的公有云实例&#…...
算法通关村-----数论问题解析
最大公约数和最小公倍数 概念描述 最大公约数(GCD)是指两个或多个整数共有约数中的最大值。 最小公倍数(LCM)是指两个或多个整数共有的倍数中的最小值 方法介绍 碾转相除法 一种用于计算两个整数的最大公约数(GCD…...
wpf prism当中 发布订阅 IEventAggregator
先订阅后发布 private readonly IEventAggregator _eventAggregator; public LoginViewModel(ILoginService iloginService, IEventAggregator eventAggregator) {_iloginService iloginService;_eventAggregator eventAggregator;_eventAggregator.GetEvent<MessageEven…...
Angular中的getter函数
Angular 中的 getter 函数每次被调用时会返回一个新对象时,这些新对象并不使用同一个堆内存。详细解释一下: Getter 函数的作用是获取某个属性的值。在 Angular 中,getter 函数通常用于获取响应式数据(例如 Observables 或 Signal…...
Python----函数的数据 拆包(元组和字典)
Python拆包: 就是把元组或字典中的数据单独的拆分出来,然后赋予给其他的变量。 拆包: 对于函数中的多个返回数据, 去掉 元组, 列表 或者字典 直接获取里面数据的过程。 元组的拆包过程 def func():# 经过一系列操作返回一个元组return 100, 200 …...
vim翻页快捷键
Vim翻页 整页 Ctrlf向下翻页,下一页,相当于Page DownCtrlb向上翻页,上一页,相当于Page Up 半页 Ctrld向下半页,下一半页,光标下移Ctrlu向上半页,上衣半页,光标上移 按行 Ctrle…...
死锁是什么?死锁是如何产生的?如何破除死锁?
1. 死锁是什么 多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止。 2. 死锁的三种典型情况 一个线程, 一把锁, 是不可重入锁, 该线程针对这个锁连续加锁两次, 就会出现死锁. 两个线程…...
给虚拟机配置静态id地址
1.令人头大的原因 当连接虚拟机的时候 地址不一会就改变,每次都要重新输入 2.配置虚拟机静态id地址 打开命令窗口执行 : vim /etc/sysconfig/network-scripts/ifcfg-ens33 按下面操作修改 查看自己子网掩码 3.重启网络 命令行输入 systemctl restart netwo…...
Mybatis-Plus 租户使用
Mybatis-Plus 租户使用 文章目录 Mybatis-Plus 租户使用一. 前言1.1 租户存在的意义1.2 租户框架 二. Mybatis-plus 租户2.1 租户处理器2.2 前置准备1. 依赖2. 表及数据准备3. 代码生成器 2.3 使用 三. 深入使用3.1 前言3.2 租户主体设值,取值3.3 部分表全量db操作3…...
vue el-table (固定列+滚动列)【横向滚动条】确定滚动条是在列头还是列尾
效果图: 代码实现: html: <script src"//unpkg.com/vue2/dist/vue.js"></script> <script src"//unpkg.com/element-ui2.15.14/lib/index.js"></script> <div id"app" style&quo…...
⑦【Redis GEO 】Redis常用数据类型:GEO [使用手册]
个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~ Redis GEO ⑦Redis GEO 基本操作命令1.geoadd …...
LeetCode 2304. 网格中的最小路径代价:DP
【LetMeFly】2304.网格中的最小路径代价:DP 力扣题目链接:https://leetcode.cn/problems/minimum-path-cost-in-a-grid/ 给你一个下标从 0 开始的整数矩阵 grid ,矩阵大小为 m x n ,由从 0 到 m * n - 1 的不同整数组成。你可以…...
STM32无刷电机无感控制实战:从反电动势波形分析到代码调参(附2836电机24V驱动实测)
STM32无刷电机无感控制实战:从反电动势波形分析到代码调参(附2836电机24V驱动实测) 实验室的示波器屏幕上,三条相电压波形与反电动势曲线正在跳动。当我把控制模式从霍尔传感器切换到无感算法时,波形突然变得杂乱无章—…...
J-Link实战指南:从基础连接到高级调试技巧
1. J-Link入门:硬件连接与基础配置 第一次接触J-Link仿真器时,我被它小巧的体型和强大的功能所震撼。作为嵌入式开发中最常用的调试工具之一,J-Link几乎成了STM32开发的标配。在实际项目中,我发现很多新手都会在硬件连接这一步栽跟…...
【关系抽取实战】从算法原理到工业级应用:构建知识图谱的核心引擎
1. 关系抽取:知识图谱的"灵魂捕手" 想象一下,你正在整理一个杂乱无章的图书馆。书架上堆满了各种书籍,但没有任何分类标签。这时候,你需要找出《红楼梦》和曹雪芹之间的关系,或者发现牛顿与万有引力定律的关…...
漫画下载神器终极指南:轻松离线阅读8大平台漫画
漫画下载神器终极指南:轻松离线阅读8大平台漫画 【免费下载链接】comics-downloader tool to download comics and manga in pdf/epub/cbr/cbz from a website 项目地址: https://gitcode.com/gh_mirrors/co/comics-downloader 还在为网络卡顿无法流畅阅读漫…...
Python实战:基于NGSIM数据集的跟驰车辆轨迹分析与特征提取
1. NGSIM数据集与跟驰行为分析基础 NGSIM(Next Generation Simulation)数据集是美国联邦公路管理局主导采集的高精度车辆轨迹数据集,它通过安装在高速公路和城市道路旁的摄像头,以0.1秒的时间分辨率记录车辆位置、速度、加速度等信…...
从电影特效到游戏UI:深入浅出聊聊Alpha通道和Premultiplied Alpha的那些‘坑’
从电影特效到游戏UI:深入浅出聊聊Alpha通道和Premultiplied Alpha的那些‘坑’ 在影视后期合成与游戏开发中,透明通道的处理就像空气般无处不在却又容易被忽视——直到出现诡异的黑边、白边或色彩失真。当你在Unity中导入精心制作的粒子特效PNG序列时&am…...
客服效率革命:如何用咕咕文本实现秒级响应
客户服务工作的核心指标之一,就是响应速度。 在电商平台的评价体系里,回复时长直接影响店铺的服务评分。 然而,面对海量咨询,即便是经验丰富的客服人员,手工打字也难以保证始终如一的快速响应。 传统的客服工作模式…...
解决 Git 报错:fatal: refusing to merge unrelated histories
最近我在同步一个深度学习课程代码库时,因为误删了本地的 .git 文件夹,遭遇了一个经典的 Git 报错。本文将复盘这次错误的解决过程。 1. 事故现场:误删 .git 引发的惨案 事情的起因是我不小心删除了项目根目录下的 .git 文件夹。为了挽救&a…...
Unity shader中TransformWorldToShadowCoord原理解析
TransformWorldToShadowCoord 的核心作用很简单:将你提供的世界坐标,转换到一个可以用于采样 Shadow Map 的坐标空间。它本质上是为你省去了手动编写矩阵乘法的繁琐步骤。🔍 核心原理:一个“三步走”的幕后过程函数内部主要执行了…...
智能体Agent输入DQN算法强化学习控制主动悬架
出DQN算法强化学习控制的主动悬架 质心加速度 悬架动绕度 轮胎位移作为智能体agent的输入 搭建了悬架的空间状态方程 可以运行 效果很好 可以与pid控制进行对比 可带强化学习dqn的Matlab代码 有详细的介绍 可供学习直接上干货。这次用DQN搞了个汽车主动悬架的控制器࿰…...
