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.hqwc.cn/news/417495.html

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

相关文章

VPS网站发布-个人网站搭建与部署-个人简历网站示例-个人简历网站案例-网站推广

文章目录 1. 个人网站搭建指南1.1 网站示例 | 个人网站 | 个人简历模版 | 个人简历网站 | 网站案例1.2 准备工具 2. 网页部署教程&#xff08;ubuntu&#xff09;2.1 购买域名2.2 购买VPS2.3 部署工具 Apache || Nginx2.1.1 网页相关文件上传到github库2.1.2 在VPS中执行一键部…

从 Context 看 Go 设计模式:接口、封装和并发控制

文章目录 Context 的基本结构Context 的实现和传递机制为什么 Context 不直接传递指针案例&#xff1a;DataStore结论 在 Go 语言中&#xff0c; context 包是并发编程的核心&#xff0c;用于传递取消信号和请求范围的值。但其传值机制&#xff0c;特别是为什么不通过指针传递…

防伪技术行业研究:年复合增长率约为10%

近年来&#xff0c;我国各种新的防伪技术不断涌现&#xff0c;部分防伪技术已经达到国际先进水平&#xff0c;并广泛应用于产品防伪、票证防伪等领域&#xff0c;推动了防伪行业的持续、健康发展。 常见的产品防伪技术有&#xff1a;隐形分子技术、二维码防伪、揭开留底防伪、安…

beego项目部署与热更新

1.开发自己的第一个项目 这里我引用的是在线聊天室&#xff0c;参考源码是https://github.com/beego/samples/tree/master/WebIM 在源码的基础上重新开发&#xff0c;整理项目发布到了liu289747235/WebIM 推荐下载源码&#xff1a;https://gitee.com/myselfyou/web-im 在线…

嵌入式Linux Qt交叉编译环境搭建

1、下载Qt编译器 TinkerBoard2主板,BuildRoot根文件系统,package自带的Qt版本为5.14.2,所以安装的版本也是5.14.2 wget https://download.qt.io/archive/qt/5.14/5.14.2/qt-opensource-linux-x64-5.14.2.run chmod a+x qt-opensource-linux-x64-5.14.2.run ./qt-opensourc…

市场监管总局发布区块链和分布式记账技术6项标准,中创积极推动区块链产业发展!

近日&#xff0c;市场监管总局&#xff08;国家标准委&#xff09;批准发布一批重要国家标准&#xff0c;涉及生产生活、绿色可持续等多个领域&#xff0c;这些标准将在引领产业发展、促进绿色转型、助力对外贸易、推动城乡建设、提升生活品质等方面发挥重要作用。 其中一项标…

IO、NIO、IO多路复用

IO是什么&#xff1f; IO分为两类&#xff0c;它们之间是有区别的&#xff0c;而且有很大的区别&#xff1b;1. 文件系统的IO 也叫本地io&#xff0c;就是和磁盘或者外围存储设备进行读写操作&#xff0c;外围设备有USB、移动硬盘等等&#xff1b;2. 网络的IO 将数据发送给对方…

不愧是字节出来的,太厉害了...

前段时间公司缺人&#xff0c;也面了许多测试&#xff0c;一开始瞄准的就是中级水准&#xff0c;当然也没指望能来大牛&#xff0c;提供的薪资在15-25k这个范围&#xff0c;来面试的人有很多&#xff0c;但是平均水平真的让人很失望。 看了简历很多上面都是写有4年工作经验&am…

车辆导航系统行业调研:市场需求量不断发展和壮大

车辆导航系统即即车载GPS导航系统&#xff0c;其内置的GPS天线会接收到来自环绕地球的24颗GPS卫星中的至少3颗所传递的数据信息&#xff0c;结合储存在车载导航仪内的电子地图&#xff0c;通过GPS卫星信号确定的位置坐标与此相匹配&#xff0c;进行确定汽车在电子地图中的准确位…

【想要安利给所有人的开发工具】最强工具ChatGPT——分享一些使用经验

目录 &#x1f525;个人使用ChatGPT的经验 &#x1f525;如何使用ChatGPT 方法一 方法二 &#x1f525;&#x1f525;提问技巧分享 1、英语翻译员 2、面试官 3、javascript 控制台 4、Excel表格 5、作曲家 6、辩手 7、小说家 8、诗人 9、数学老师 10、网络安全…

chrony介绍和安装

chrony介绍和安装 1.chrony&#xff08;时间同步服务&#xff09; 1.1 chrony介绍 Chrony 是一个用于时间同步的软件&#xff0c;它旨在提供高精度的系统时钟同步。Chrony 软件包括一个 NTP&#xff08;Network Time Protocol&#xff0c;网络时间协议&#xff09;服务器和客…

【咕咕送书 | 第八期】羡慕同学进了大厂核心部门,看懂这本书你也能行!

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏:《linux深造日志》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! ⛳️ 写在前面参与规则 ✅参与方式&#xff1a;关注博主、点赞、收藏、评论&#xff0c;任意评论&#xff08;每人最多评论…