C++中的static(静态)

2014年1月19日   内容整理自The Cherno:C++系列

2014年1月20日   内容整理自《程序设计教程:用C++语言编程 第三版》 陈家骏  郑滔

---------------------------------------------------------------------------------------------------------------------------------

static关键字在C++中有2个意思,这取决于上下文

  • 1.在类或者结构体的外部使用static关键字
  • 2.在类或者结构体内部使用static关键字

简而言之:

1.类或结构体外部的static,意味着你声明为static的符号将只能对你定义它的翻译单元可见

2.而类或结构体内部的静态变量static,意味着这个变量将于所有类的实例共享内存,这意味着该静态变量在你在类中创建的所有实例中。有时,同一个类的不同对象需要共享数据,如果使用全局变量来表示共享的数据,则缺乏对数据的保护。

---------------------------------------------------------------------------------------------------------------------------------

1.在类或者结构体的外部使用static关键字

现在我们集中研究在类或结构体外部的static变量

//在具有如下两个文件main.cpp和Static.cpp的情况下运行代码,没有报错

然而,让我们在Static.cpp中删除关键字static,再次运行报错,原因是多重定义了全局变量s_Variable

so,我们不可以在同一个项目中有两个同名的全局变量-

尝试1:extern关键字

尝试2:static关键字

在某个.cpp文件中将变量声明为static,可以类比于在类中声明一个private的变量,其他的所有翻译单元都不能看到这个s_variable变量,the linker will not see this in a global scope 

尝试在Static.cpp中定义一个函数试试 ,仍显示重复定义

尝试将Static.cpp中的function(){}函数标记为static的,点击运行,就不会报错了

如果你想在头文件中声明一个静态变量,并将该头文件包含在两个不同的C++文件中,这就相当于在两个文件中都声明了相同的静态变量 

---------------------------------------------------------------------------------------------------------------------------------

2.在类或者结构体的内部使用static关键字

  在C++中,采用类的静态成员(static member)来解决同一个类的对象共享数据的问题,与普通数据成员不同的是,类定义中的静态数据成员对于该类的所有对象只存在一个拷贝,当通过一个对象改变了静态数据成员的值时,通过同类的其他对象可以看到这个修改。

类的静态成员分为:

  • 类的静态数据成员(static data)
  • 类的静态成员函数(static function)

类定义内部声明静态数据成员,而静态的数据成员往往需要在类的外部定义并初始化:

 访问类的静态成员的方式有两种:
  • 通过对象访问,格式如上述object.Sum()
  • 通过类名访问,格式如上述A::Share

  如果你把static和变量一起使用,这意味着在类的所有实例中,这个变量都只有一个实例

如果我创建一个名为Entity的类,我不断创建Entity的实例,我仍然只会得到那个变量的一个版本

意思是如果某个实例改变了这个静态变量----在这个类中的所有实例都会反映这个变化。

so,通过类的实例来引用静态变量是没有意义的。

示例1:

在上述代码中将x,y变成静态的 ,main函数中的初始化就会失败,因为x和y不再是类成员

解决方案:定义x和y

 

//这里有点乱了,下次回来改 

书上例题

---------------------------------------------------------------------------------------------------------------------------------

#include<iostream>
//P233例题
/*实现对某类的对象的计数:* 我们有时需要在程序执行的某个时刻知道创建了多少个某类对象(还未消亡)* 为了实现这个功能,我们可以在类中定义一个静态数据成员,每创建一个类的对象,就在构造函数中把该静态数据成员的值加1* 每撤销一个该类的对象就在析构函数中把该静态数据成员的值减1* 在程序运行的任何时刻,通过该静态数据成员,我们就可以知道某时刻该类的对象的个数*/
//note:struct和class的书写格式都是直接花括号
class A{static int Obj_count;
public:A(){Obj_count++;}//构造函数、(这里我还没有学到)A(const A& a){Obj_count++;}~A(){Obj_count--;}//析构函数//类中还定义了一个静态成员函数,用于获得创建的A类对象数目static int Get_Num_Of_Objects(){return Obj_count;}
};//class A

int A::Obj_count=0;//static变量被初始化为0int main(){A arr[10];//每一个数组元素都是一个A 类for(int i=0;i<10;i++){A arr[i];}std::cout<<"It's 4:34 ,2024/1/20,the number of class A's objects is:"<<A::Get_Num_Of_Objects()<<std::endl;A object;std::cout<<"It's 4:34 ,2024/1/20,the number of class A's objects is:"<<A::Get_Num_Of_Objects()<<std::endl;}

---------------------------------------------------------------------------------------------------------------------------------

运行结果:

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JS执行顺序

众所周知&#xff0c;JavaScript 是单线程语言,只能同时执行做一件事(js只有一个线程&#xff0c;称之为main thread-主线程) 1.Javascript 运行机制 main thread 主线程和 call-stack 调用栈(执行栈)&#xff0c;所有的任务都会被放到调用栈等待主线程执行。 2.Javascript 任…

SpringBoot+beetl idea热更新解决方案

SpringBootbeetl idea热更新解决方案 第一在application中开启&#xff1a; beetl:resource-auto-check: true #热加载beetl模板&#xff0c;开发时候用第二在application中开启&#xff1a; devtools: 这个部分专门用于配置Spring Boot DevTools的相关参数。DevTools…

十八周周报

文章目录 摘要文献阅读3D reconstruction of human bodies from single-view and multi-view images: A systematic review简介研究方法搜索策略选择标准搜索结果 三维重建方法单个视图中使用的技术基于参数化人体模型的回归基于非参数人体模型的回归 多个视图中使用的技术基于…

PaddleNLP评论观点抽取和属性级情感分析

项目地址&#xff1a;PaddleNLP评论观点抽取和属性级情感分析 - 飞桨AI Studio星河社区 (baidu.com) 情感分析旨在对带有情感色彩的主观性文本进行分析、处理、归纳和推理&#xff0c;其广泛应用于消费决策、舆情分析、个性化推荐等领域&#xff0c;具有很高的商业价值。 依托…

C#,因数分解(质因子分解)Pollard‘s Rho算法的源代码

因数分解&#xff08;也称为质因子分解&#xff09;&#xff1a;将一个大整数分解它的质因子之乘积的算法。 Pollard Rho算法的基本思路&#xff1a;先判断当前数是否是素数&#xff08;质数&#xff09;&#xff0c;如果是&#xff0c;则直接返回。如果不是&#xff0c;继续找…

11、Kafka ------ Kafka 核心API 及 生产者API 讲解

目录 Kafka核心API 及 生产者API讲解★ Kafka的核心APIKafka包含如下5类核心API&#xff1a; ★ 生产者APIKafka 的API 文档 ★ 使用生产者API发送消息 Kafka核心API 及 生产者API讲解 官方文档 ★ Kafka的核心API Kafka包含如下5类核心API&#xff1a; Producer API&#x…

spring data mongo 在事务中,无法自动创建collection

spring data mongo 在事务中,无法自动创建collection org.springframework.dao.DataIntegrityViolationException: Write operation error on server xxx:30001. Write error: WriteError{code=263, message=Cannot create namespace xxx.xxxin multi-document transaction.…

Redis(四)

1、Redis的单/多线程 1.1、单线程 其实直接说Redis什么单线程或者是多线程&#xff0c;不太准确&#xff0c;在redis的4.0版主之前是单线程&#xff0c;然后在之后的版本中redis的渐渐改为多线程。 Redis是单线程主要是指Redis的网络IO和键值对读写是由一个线程来完成的&#…

小白水平理解面试经典题目LeetCode 125 Valid Palindrome(验证回文串)

125 验证回文串 说到公司面试&#xff0c;那就是得考出高度&#xff0c;考出水平&#xff0c;什么兼顾这两者呢&#xff0c;那就得看这道 原题描述&#xff1a; 给定一个字符串&#xff0c;判断它是否是回文串。回文串是指正读和反读都一样的字符串。 输入: “A man, a pla…

超级弱口令检查工具

工具介绍 超级弱口令检查工具是一款Windows平台的弱口令审计工具&#xff0c;支持批量多线程检查&#xff0c;可快速发现弱密码、弱口令账号&#xff0c;密码支持和用户名结合进行检查&#xff0c;大大提高成功率&#xff0c;支持自定义服务端口和字典。 工具采用C#开发&#…

1.19(232.用栈实现队列)

1.19(232.用栈实现队列) 在push数据的时候&#xff0c;只要数据放进输入栈就好&#xff0c;但在pop的时候&#xff0c;操作就复杂一些&#xff0c;输出栈如果为空&#xff0c;就把进栈数据全部导入进来&#xff08;注意是全部导入&#xff09;&#xff0c;再从出栈弹出数据&a…

unity-声音与声效OLD

声音与声效 基本概念audio clipaudio listeneraudio source 基本操作如何创建音频源&#xff08;背景音乐&#xff09;如何在测试的时候关闭声音 常用代码一般流程如何在一个物体上播放多个音效如何在代码中延时播放多个声音如何在代码中停止音频的播放如何判断当前是否在播放音…

福昕软件的使用

快捷操作 快捷键 快捷键功能备注Ctrl P打印 Ctrl W关闭 Ctrl B书签 鼠标放菜单栏&#xff0c;单击右键即可导入/导出 自定义菜单栏文件-->偏好设置-->文档 1、多实例&#xff1a;单击PDF后均重新打开一个新界面。

MySQL中SELECT字句的顺序以及具体使用

目录 1.SELECT字句及其顺序 2.使用方法举例 3.HAVING和WHERE 1.SELECT字句及其顺序 *下表来自于图灵程序设计丛书&#xff0c;数据库系列——《SQL必知必会》 2.使用方法举例 *题目来源于牛客网 题目描述 现在运营想要查看不同大学的用户平均发帖情况&#xff0c;并期望结…

[AI]文心一言出圈的同时,国外的ChatGPT-4.5最新资讯

前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff1a;https://www.captainbed.cn/z ChatGPT体验地址 文章目录 前言4.5key价格泄漏ChatGPT4.0使用地址ChatGPT正确打开方式最新功能语音助手存档…

为了Atcoder系列复习C++语法

很久之前学过忘了 为了打比赛重新复习 每打一次就更一次 含日语内容 B - 1.01.出力とコメント 1.cout << 2525 << endl; 可以没有endl 结尾. endl作用是换行 2.整除问题 int情况下1/2无法变成0.5 所以1/2应该放在后面 100 * (100 1) / 2 3.f…

五、模 板

1 泛型编程 以往我们想实现一个通用的交换函数&#xff0c;可能是通过下面的方式来实现的&#xff1a; void Swap(int& left, int& right) {int temp left;left right;right temp; } void Swap(double& left, double& right) {double temp left;left ri…

【机器学习】四大类监督学习_模型选择与模型原理和场景应用_第03课

监督学习中模型选择原理及场景应用 监督学习应用场景 文本分类场景&#xff1a; o 邮件过滤&#xff1a;训练模型识别垃圾邮件和非垃圾邮件。 o 情感分析&#xff1a;根据评论或社交媒体内容的情感倾向将其分类为正面、负面或中性评价。 o 新闻分类&#xff1a;将新闻文章自动…

适用于 Windows 11 的 12 个最佳免费 PDF 编辑器

除了绘图等基本功能外&#xff0c;一些适用于 Windows 11 的免费 PDF 编辑器还具有 AI、OCR 识别和书签等高级功能。 我们的列表包含易于立即下载的 PDF 编辑软件工具。 这些工具不仅可以帮助转换 PDF、编辑、上传、删除、裁剪、分割、提取等。 PDF 是指便携式文档格式&…

【爬虫实战】2024知乎热榜可视化爬取

项目功能简介&#xff1a; 1.支持配置&#xff1b; 2.单次爬取&#xff1b; 3.循环爬取&#xff1b; 4.爬虫暂停&#xff1b; 5.数据清除&#xff1b; 6.数据保存到csv文件&#xff1b; 7.程序支持打包成exe文件&#xff1b; 8.项目操作说明文档&#xff1b; 9.模块封装到类&a…