当前位置: 首页 > news >正文

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 在一个类或一个结构体中的具体情况。 在几乎所有面向对象的语言中&#xff0c;静态在一个类中意味着特定的东西。这意味着在类的所有实例中&#xff…...

【腾讯云云上实验室-向量数据库】Tencent Cloud VectorDB在实战项目中替换Milvus测试

为什么尝试使用Tencent Cloud VectorDB替换Milvus向量库&#xff1f; 亮点&#xff1a;Tencent Cloud VectorDB支持Embedding&#xff0c;免去自己搭建模型的负担&#xff08;搭建一个生产环境的模型实在耗费精力和体力&#xff09;。 腾讯云向量数据库是什么&#xff1f; 腾…...

git clone -mirror 和 git clone 的区别

目录 前言两则区别git clone --mirrorgit clone 获取到的文件有什么不同瘦身仓库如何选择结语开源项目 前言 Git是一款强大的版本控制系统&#xff0c;通过Git可以方便地管理代码的版本和协作开发。在使用Git时&#xff0c;常见的操作之一就是通过git clone命令将远程仓库克隆…...

基于51单片机的公交自动报站系统

**单片机设计介绍&#xff0c; 基于51单片机的公交自动报站系统 文章目录 一 概要公交自动报站系统概述工作原理应用与优势 二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 很高兴为您介绍基于51单片机的公交自动报站系统&#xff1a; 公交自动报…...

NextJS开发:Image组件的使用及缺陷

Next.js 中的 Image 组件相比于传统的 img 标签有以下几个优点&#xff1a; 懒加载&#xff1a;Image 组件自带懒加载&#xff0c;当页面滚动到 Image 组件所在位置时才会加载图片&#xff0c;从而加快页面的渲染速度。自动优化&#xff1a;Image 组件会自动将图片压缩、转换格…...

网络安全面试经历

2023-11-22 X亭安全服务实习生面试 一面&#xff1a; 工作方向&#xff1a;偏蓝队 总结&#xff1a;实习蓝队面试没有什么难度&#xff0c;没有什么技术上的细节问题&#xff0c;之前准备的细节问题没有考 最后和面试官聊了聊对网安的认识&#xff0c;聊了聊二进制的知识…...

Rust语言入门教程(四) - 数据类型

标量类型(Scalar Types) 在Rust中&#xff0c;一共有4中标量类型&#xff0c; 也就是基本数据类型&#xff0c;分别是&#xff1a; 整型&#xff08;Integers&#xff09;浮点型&#xff08;Floats&#xff09;布尔型&#xff08;Boolean&#xff09;字符型&#xff08;Chara…...

华为云人工智能入门级开发者认证学习笔记

人工智能入门级开发者认证 人工智能定义 定义 人工智能 (Artificial Intelligence) 是研究、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。 强人工智能 vs 弱人工智能 强人工智能&#xff1a;强人工智能观点认为有可能制造出真正能推理&#xff08…...

腾讯云发布新一代基于AMD处理器的星星海云服务器实例SA5

基础设施的硬实力&#xff0c;愈发成为云厂商的核心竞争力。 11月24日&#xff0c;腾讯云发布了全新一代星星海服务器。基于自研服务器的高密设计与硬件升级&#xff0c;对应云服务器SA5是全球首家搭载第四代AMD EPYC处理器&#xff08;Bergamo&#xff09;的公有云实例&#…...

算法通关村-----数论问题解析

最大公约数和最小公倍数 概念描述 最大公约数&#xff08;GCD&#xff09;是指两个或多个整数共有约数中的最大值。 最小公倍数&#xff08;LCM&#xff09;是指两个或多个整数共有的倍数中的最小值 方法介绍 碾转相除法 一种用于计算两个整数的最大公约数&#xff08;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 函数每次被调用时会返回一个新对象时&#xff0c;这些新对象并不使用同一个堆内存。详细解释一下&#xff1a; Getter 函数的作用是获取某个属性的值。在 Angular 中&#xff0c;getter 函数通常用于获取响应式数据&#xff08;例如 Observables 或 Signal…...

Python----函数的数据 拆包(元组和字典)

Python拆包&#xff1a; 就是把元组或字典中的数据单独的拆分出来&#xff0c;然后赋予给其他的变量。 拆包: 对于函数中的多个返回数据, 去掉 元组, 列表 或者字典 直接获取里面数据的过程。 元组的拆包过程 def func():# 经过一系列操作返回一个元组return 100, 200 …...

vim翻页快捷键

Vim翻页 整页 Ctrlf向下翻页&#xff0c;下一页&#xff0c;相当于Page DownCtrlb向上翻页&#xff0c;上一页&#xff0c;相当于Page Up 半页 Ctrld向下半页&#xff0c;下一半页&#xff0c;光标下移Ctrlu向上半页&#xff0c;上衣半页&#xff0c;光标上移 按行 Ctrle…...

死锁是什么?死锁是如何产生的?如何破除死锁?

1. 死锁是什么 多个线程同时被阻塞&#xff0c;它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞&#xff0c;因此程序不可能正常终止。 2. 死锁的三种典型情况 一个线程, 一把锁, 是不可重入锁, 该线程针对这个锁连续加锁两次, 就会出现死锁. 两个线程…...

给虚拟机配置静态id地址

1.令人头大的原因 当连接虚拟机的时候 地址不一会就改变&#xff0c;每次都要重新输入 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 租户主体设值&#xff0c;取值3.3 部分表全量db操作3…...

vue el-table (固定列+滚动列)【横向滚动条】确定滚动条是在列头还是列尾

效果图&#xff1a; 代码实现&#xff1a; html&#xff1a; <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 [使用手册]

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ Redis GEO ⑦Redis GEO 基本操作命令1.geoadd …...

LeetCode 2304. 网格中的最小路径代价:DP

【LetMeFly】2304.网格中的最小路径代价&#xff1a;DP 力扣题目链接&#xff1a;https://leetcode.cn/problems/minimum-path-cost-in-a-grid/ 给你一个下标从 0 开始的整数矩阵 grid &#xff0c;矩阵大小为 m x n &#xff0c;由从 0 到 m * n - 1 的不同整数组成。你可以…...

Appium+python自动化(十六)- ADB命令

简介 Android 调试桥(adb)是多种用途的工具&#xff0c;该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具&#xff0c;其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利&#xff0c;如安装和调试…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)

0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述&#xff0c;后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作&#xff0c;其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象&#xff0c;只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意&#xff1a;它移动的位置必须是相连的有内容的单元格…...

C#中的CLR属性、依赖属性与附加属性

CLR属性的主要特征 封装性&#xff1a; 隐藏字段的实现细节 提供对字段的受控访问 访问控制&#xff1a; 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性&#xff1a; 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑&#xff1a; 可以…...

逻辑回归暴力训练预测金融欺诈

简述 「使用逻辑回归暴力预测金融欺诈&#xff0c;并不断增加特征维度持续测试」的做法&#xff0c;体现了一种逐步建模与迭代验证的实验思路&#xff0c;在金融欺诈检测中非常有价值&#xff0c;本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...

MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)

macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 &#x1f37a; 最新版brew安装慢到怀疑人生&#xff1f;别怕&#xff0c;教你轻松起飞&#xff01; 最近Homebrew更新至最新版&#xff0c;每次执行 brew 命令时都会自动从官方地址 https://formulae.…...

ZYNQ学习记录FPGA(一)ZYNQ简介

一、知识准备 1.一些术语,缩写和概念&#xff1a; 1&#xff09;ZYNQ全称&#xff1a;ZYNQ7000 All Pgrammable SoC 2&#xff09;SoC:system on chips(片上系统)&#xff0c;对比集成电路的SoB&#xff08;system on board&#xff09; 3&#xff09;ARM&#xff1a;处理器…...

跨平台商品数据接口的标准化与规范化发展路径:淘宝京东拼多多的最新实践

在电商行业蓬勃发展的当下&#xff0c;多平台运营已成为众多商家的必然选择。然而&#xff0c;不同电商平台在商品数据接口方面存在差异&#xff0c;导致商家在跨平台运营时面临诸多挑战&#xff0c;如数据对接困难、运营效率低下、用户体验不一致等。跨平台商品数据接口的标准…...

SQL注入篇-sqlmap的配置和使用

在之前的皮卡丘靶场第五期SQL注入的内容中我们谈到了sqlmap&#xff0c;但是由于很多朋友看不了解命令行格式&#xff0c;所以是纯手动获取数据库信息的 接下来我们就用sqlmap来进行皮卡丘靶场的sql注入学习&#xff0c;链接&#xff1a;https://wwhc.lanzoue.com/ifJY32ybh6vc…...

VSCode 使用CMake 构建 Qt 5 窗口程序

首先,目录结构如下图: 运行效果: cmake -B build cmake --build build 运行: windeployqt.exe F:\testQt5\build\Debug\app.exe main.cpp #include "mainwindow.h"#include <QAppli...