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

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;}

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

运行结果:

相关文章:

  • 分布式锁4 :数据库DB实现分布式锁的悲观锁和乐观锁,unique实现方式
  • Spring、Spring-MVC、Mybatis、Mybatis-generator整合核心配置文件记录
  • 如何发布自己的npm包
  • ​LeetCode解法汇总2182. 构造限制重复的字符串
  • 大数据技术原理及应用课实验4: NoSQL和关系数据库的操作比较
  • Java leetcode简单刷题记录3
  • 【Linux 内核源码分析】堆内存管理
  • Glass Scienttan
  • 题记(22)--计算表达式
  • Unity中实现捏脸系统
  • HCIA-HarmonyOS设备开发认证-HarmonyOS简介
  • 大模型学习之书生·浦语大模型6——基于OpenCompass大模型评测
  • 安卓Spinner文字看不清
  • 基于yolov5-master和pyqt5的森林火灾监测软件
  • Webpack5入门到原理2:基本使用
  • 【108天】Java——《Head First Java》笔记(第1-4章)
  • 【162天】黑马程序员27天视频学习笔记【Day02-上】
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • JAVA_NIO系列——Channel和Buffer详解
  • quasar-framework cnodejs社区
  • Spring Boot MyBatis配置多种数据库
  • v-if和v-for连用出现的问题
  • vue从创建到完整的饿了么(11)组件的使用(svg图标及watch的简单使用)
  • 程序员最讨厌的9句话,你可有补充?
  • 创建一种深思熟虑的文化
  • 大型网站性能监测、分析与优化常见问题QA
  • 工程优化暨babel升级小记
  • 前端面试题总结
  • 首页查询功能的一次实现过程
  • 终端用户监控:真实用户监控还是模拟监控?
  • ​configparser --- 配置文件解析器​
  • #数学建模# 线性规划问题的Matlab求解
  • $HTTP_POST_VARS['']和$_POST['']的区别
  • ( 10 )MySQL中的外键
  • (12)Linux 常见的三种进程状态
  • (13):Silverlight 2 数据与通信之WebRequest
  • (16)Reactor的测试——响应式Spring的道法术器
  • (52)只出现一次的数字III
  • (poj1.3.2)1791(构造法模拟)
  • (pojstep1.3.1)1017(构造法模拟)
  • (附源码)springboot 基于HTML5的个人网页的网站设计与实现 毕业设计 031623
  • (黑客游戏)HackTheGame1.21 过关攻略
  • (三)终结任务
  • (四) Graphivz 颜色选择
  • .[hudsonL@cock.li].mkp勒索加密数据库完美恢复---惜分飞
  • .bat批处理(五):遍历指定目录下资源文件并更新
  • .net 逐行读取大文本文件_如何使用 Java 灵活读取 Excel 内容 ?
  • ::前边啥也没有
  • [ C++ ] STL---string类的使用指南
  • [@Controller]4 详解@ModelAttribute
  • [2021]Zookeeper getAcl命令未授权访问漏洞概述与解决
  • [Android学习笔记]ScrollView的使用
  • [CVPR2021]Birds of a Feather: Capturing Avian Shape Models from Images
  • [Firefly-Linux] RK3568 pca9555芯片驱动详解
  • [hive] posexplode函数