当前位置: 首页 > 编程日记 > 正文

谁知道静态成员的纠结心境

我们在实际开发的过程中,可能需要某些类的成员变量并不是针对每一个对象的,而是针对每一个类而言的,比如在银行中有一个利率数据,我们希望的是,当一个利率改变的时候,所有的对象都能够看到这个改变的数据,并利用它,而不是每一个对象都有一个利率成员变量。这个时候就设计到了静态成员变量。

一. 内存那些事
静态成员变量是存放在静态全局区(数据段),一个对象改变了其中的静态变量,其他对象的这一变量也都随之改变。
说其是静态变量,个人是这样理解的,该变量不会因为某一次函数调用或者某个对象的销毁而销毁,它是一直存在在静态全局区的。也可以这样理解,它在静态全局区的位置始终没有变过,它是静止不动的,直到整个程序结束掉。

二. C语言中"自私"的static(他人不可见)
static的三个私生子
说static三个私生子,个人的理解是这个样子的,static修饰的变量或者是函数只在当前文件中有用,其他的文件对这些函数或者是变量都是不可见的。
私生子承受了这么大的压力,当然是要给与好处的,对于静态变量如果没有初始化的话,如果这个变量是int类型的,它被初始化为0,如果是字符型的,则被初始化为'\0'。

私生子1--局部变量(私生子中的私生子)
修饰局部变量的时候虽然它的存储方式发生了改变,由原来的栈区放置在了静态全局区,这个时候,他是一直存在着的,但是它的作用域没有改变,就是说它依然在只这个函数里面有效。

私生子1--全局变量
如果是一个普通的全局变量,比如在一个工程中的某个文件中定义的变量在其他的文件中也可以使用,此时只需要加上一个extern就可以使用了,但是这个全局变量加上static之后就不能在其他的文件中使用了。它在其他文件中的可见性就改变了
私生子3--函数
修饰函数的时候和修饰变量的情况差不多,只不过是改变了函数的可见性而已

三. C++中“孤独”的static(没有“对象”的对象)
当我们在类中定义一个静态变量的时候,实际上是声明一个静态变量,拥有静态变量的每个类创建的对象中实际是没有这个静态成员变量的相关的数据的,这个成员变量是存放在静态全局区,所以我们要在类的外面声明这个静态变量在类外定义的时候,要加上类的作用域符号,指定是哪个类的静态成员。
因为静态成员变量不属于任何一个对象,所以我们不能使用类的构造函数进行静态成员变量的初始化,我们必须在类的外部定义并初始化静态成员变量
静态成员函数是没有this指针的,同样的道理,静态函数在只有一个副本,它不属于任何一个对象所拥有。

调用静态成员函数的几种方式
static修饰的变量或者函数只有一个副本,它不属于任何一个对象的,所以这个可以使用对象和类去访问,用类访问的时候需要加上类的作用域
虽然静态成员函数不属于某个对象,使用类的对象、引用和指针来进行访问,还有一种方式是使用类名::函数名进行访问(原因是这个函数也是静态的)。

四. static的死对头--extern
关于extern,我们可以使用extern在一个文件中去访问其他文件中的函数或者是变量,但是这个时候要求如果访问的是变量的话,则要求访问的变量是全局属性的,并且不是静态的,如果这个变量是在一个函数内部的,即是时在main函数的内部也访问不了,因为它不具有全局属性。
我们为什么不使用#include这种方式来调用函数或者是一个变量呢,因为是extern的速度更快
还应该注意的一个问题是,我们经常说的是数组名实际上是一个指针,就是在使用的时候完全可以把它当做一个指针来使用,但是如果我们在一个文件中定义了一个全局数组,比如char arr[] = "hello";然后在另一个 变量中 去使用extern char* arr;,但是这个时候是错误的,因为数组和指针还是有不同 的,这个时候只有声明为extern char arr[];才可以使用。
五. static的好基友--全局变量
总结:其实静态变量和全局变量有很多地方一样,唯一的不同时静态全局变量具有隐藏的属性。


看看静态成员可以帮我们解决什么问题吧
求1+2+3+...+n,要求不能使用乘除法,for,while,if,else,switch,case等关键字以及条件判断语句

    #include <iostream>  using namespace std;  class Temp  {  public:  Temp()  {  ++N;  Sum+=N;  }  static void Reset()  {  N=0;  Sum=0;  }  static int GetSum()  {  return Sum;  }  private:  static int N;  static int Sum;  };  int Temp::N=0;  int Temp::Sum=0;  int solution_Sum(int n)  {  Temp::Reset();  Temp *a=new Temp[n];  delete []a;  a=0;  return Temp::GetSum();  }  int main()  {  cout<<solution_Sum(100)<<endl;  return 0;  }  



解题思路:因为定义了静态成员变量,我们这里定义了对象数组,每次实例化一个对象 的时候,就会改变静态变量,而且是累加的,所以到最后就得到了结果了。























相关文章:

.net ConfigurationSectionDesigner插件使用

最近接触了vs2010的一款插件&#xff1a;ConfigurationSectionDesigner。ConfigurationSectionDesigner是一个图型化设计.net的配置块和自动生成需要代码和schema定义的codeplex上的一个开源项目&#xff0c;现在分享出来&#xff0c;希望对大家有所帮助。 .Net配置体系中可以是…

对应到对象 数据库驼峰_【GI的自主空间数据库】一种竞争力,叫技术引领;一种竞争力,叫时间沉淀...

引子&#xff1a;GI的自主空间数据库及GIS框架来自于求学时MAPGIS的引导&#xff0c;工作时ARCGIS的追随&#xff0c;读博时IBM和Microsoft2篇文献...。即使在大数据技术发展的今天&#xff0c;自主空间数据库存储仍然有其技术优势&#xff0c;近20年的时间沉淀&#xff0c;是G…

TSM备份Windows数据

一、备份数据 1.使用备份勾当客户端&#xff0c;可以在原始文件出现损坏的时候&#xff0c;恢复备份版本。TSM提供备份和恢复文档的类型包括:FAT&#xff0c;NTFS和FAT32.2.合适备份和合适归档文件当备份-归档客户端备份或归档一个文件&#xff0c;他会发送一份文档的副本和它的…

GM Tech 2 works with Hummer Yes or No

This is about GM Tech 2 scan tool for Hummer troubleshooting and programming. Can I have a cheap Tech 2 for Hummer? Yep. Both the original and HQ clone can work for your car. Where can I get a working clone at a good price? https://www.obd2tool.com/goods…

程序的编译和链接过程

一.虚拟机、linux简介简单介绍一下虚拟机还有就是各种操作系统&#xff0c;比如centos&#xff0c;Ubuntu操作系统&#xff1a;linux&#xff08;centos、Ubuntu、redhat&#xff09;&#xff0c;Android&#xff0c;Windows&#xff08;xp、win8、win10&#xff09;进程&#…

Nosql网络阅读

#1 Node.jsmongodb 开源项目 https://github.com/DoubleSpout/wujb  作者博客:http://snoopyxdy.blog.163.com/blog/static/60117440201261844125973/ #1 关系数据库还是NoSQL数据库 NoSQL的分类 NoSQL仅仅是一个概念&#xff0c;NoSQL数据库根据数据的存储模型和特点分为很多…

python 文案自动生成_Python自动化测试如何自动生成测试用例?

原文作者&#xff1a;陈安妮annie1原出处&#xff1a;简书上文内容不用于商业目的&#xff0c;如涉及知识产权问题&#xff0c;请权利人联系博为峰&#xff0c;我们将立即处理。传统的测试用例需要测试或者开发人员将用户的操作用代码表示出来&#xff0c;通过断言判断是否和预…

Linux下图解minicom安装

Linux下图解minicom安装 minicom是一个串口通信工具&#xff0c;就像Windows下的HyperTerminal。可用来与串口设备通信&#xff0c;如调试交换机和Modem等。它的Ubuntu软件包的名称就叫minicom&#xff0c;用apt-get install minicom即可安装。全文见附件pdf

【C#技术】一篇文章搞掂:Infragistics组件库

工具栏 // 按钮不可按 tool.SharedProps.Enabled false; Grid // Grid中记录时间 // 建议SQL Server中使用字符字段&#xff08;没有深入测试&#xff0c;只是字符字段可行&#xff09;&#xff0c;然后设置Grid的属性中&#xff0c;列的Style属性为Time或TimeWithSpin// 使用…

移动端开发小结

1. viewport viewport&#xff1a;除去所有工具栏、状态栏、滚动条等之后用于查看网页的区域&#xff0c;打个比方&#xff0c;现在有一张报纸摆在你面前&#xff0c;但是这张报纸被一本书压住了&#xff0c;所以你只能看到报纸的一部分&#xff0c;这部分可以查看到的区域就是…

vim编辑文章后不能修改

我们在使用vim打开一个文件的时候&#xff0c;经常会弹出下面的界面 为什么会出现这个界面呢 用vim编辑文件(如这里的test.txt)时,系统会自动产生一个文件叫.test.txt.swp.如果正常退出,此文件会被自动删去.如果上次非正常退出,如果再编辑它,系统会首先查.test.txt.swp 是否存…

echart x轴标签偏移_移动端H5页面滑动手势X轴实例

话不多少&#xff0c;上代码。let touchX 0 // 默认初始值// 两行注释伪代码&#xff0c;绑定 touchstart 与 touchend 事件// dom.addEvenetListener(touchstart, touchStart)// dom.addEvenetListener(touchend, touchEnd)function touchStart(e) { // 手指触碰时候&#xf…

读书笔记(2) OpenLayers中的图层

OpenLayers有多个不同的图层类&#xff0c;每一个都可以连接到不同的地图服务器。例如通过Layer.WMS类可以连接到WMS地图服务器&#xff0c;通过Layer.Google类可以连接到谷歌地图服务器。OpenLayers中的每个图层都是独立的&#xff0c;对一个的操作不会影响到另外一个。 不管地…

自定义WPF窗体形状

介绍 你好WPF爱好者。 随着WPF等统一API语言的发明&#xff0c;丰富用户界面变得非常容易。 创建丰富的用户界面只是一个想法。 您需要拥有的是创造性思维和最新技术融合。 WPF和Expression Blend在制作丰富的UI应用程序&#xff0c;清晰的图形和非常好的动画方面非常有用。 背…

与jQuery的感情碰撞——由浅入深学jQuery

原来的时候自己看过jQuery&#xff0c;但是对于什么是jQuery&#xff0c;除了知道jQuery是一种javascript类库外&#xff0c;除了会用几个网页特效外&#xff0c;其他的我这真的是不知道啊。眼看自己就要找工作了&#xff0c;所以自己需要好好学习一下&#xff0c;系统的了解一…

线程互斥和同步-- 互斥锁

一. 线程分离我们一般创建的线程是可结合的&#xff0c;这个时候如果我们调用pthread_jion()去等待的话&#xff0c;这种等待的方式是阻塞式等待&#xff0c;如果主线程一直等待&#xff0c;主线程就无法做其他的事情了&#xff0c;所以应该使用线程分离&#xff0c;让子线程由…

calipso是什么意思_眰恦是什么意思?

展开全部眰恦作为一个不常见到的词&#xff0c;其实出自一本同名小说的书名。眰恦读作zh shng &#xff0c;在书中62616964757a686964616fe59b9ee7ad9431333433656665的意思就是&#xff0c;目光所至&#xff0c;心之所向&#xff0c;皆是你。眰&#xff0c;单字意思是视&#…

一个mongosee例子

var express require(express),mongoose require(mongoose); //引入mongoose模块 //连接mongodb数据库 nodejs为数据库名称 mongoose.connect(mongodb://localhost/nodejs);//获取Schema 以及 ObjectId 对象 var Schema mongoose.Schema,ObjectId Schema.ObjectId;//创建一…

mongoDB入门

**使用了不存在的对象&#xff0c;即创建该对象use db 使用db数据库 show dbs 查看当前服务器中写在磁盘上的数据库 show tables 查看数据库中的collection db 查看当前使用的数据库1.增删改查&#xff1a; 增&#xff1a;db.collection.insert({数据}) 自动生成 _id : ObjectI…

哈希--直接定值法和除留取余法

1. 哈希是一种算法&#xff0c;哈希表是用哈希算法构造出来的一种数据结构2. 哈希算方法的几种方法直接定值法 这里有一个例题&#xff0c;就是我们想判断某一字符串中&#xff0c;某一个字符出现的个数&#xff0c;我们可以使用哈希的思想&#xff0c;就是可以遍历一遍字符串&…

两条波浪线符号_四年级数学上册第二单元“线的认识”作业单(附带答案)

“线的认识”作业单一、线段、射线和直线。1.“线段、射线和直线”之间的联系与区别。名称形状长度端点关系2.表示方法&#xff1a;分别画出一条线段、射线和直线&#xff0c;并用字母进行表示。3.概念&#xff1a; (1) (2) (3) 二、相交与垂直1.概念&#xff1a;(1) (2)表示方…

CTime类小结1

参考&#xff1a;http://www.cnblogs.com/chuncn/archive/2009/03/12/1409261.html CTime类1&#xff0e;构造和初始化CTime类对象CTime类有下列构造函数&#xff1a;CTime&#xff08; &#xff09;;CTime&#xff08; const CTime& timeSrc &#xff09;;CTime&#xff0…

oracle数据库动态与静态注册

oracle数据库动态与静态注册 动态注册:1.服务名来自于参数文件中的service_names或者是db_name与db_domain的组合;2.实例名来自与参数文件中的instance_name;3.动态注册不需要listener.ora监听文件支持;4.实例状态为READY或BLOCKED;静态注册:1.服务名来自于监听文件中的GLOBAL_…

如何实现流畅观影体验?视频类应用内存和CPU大调查

如果把手机内存和CPU想象成固定面积的田地&#xff0c;单个应用对内存和CPU的占用则可比喻为个人的一亩三分地儿。当应用内存和CPU占用过高时&#xff0c;便过多占用了整个田地资源&#xff0c;挤压了邻家应用的面积&#xff0c;那么手机能够同时运行的应用的数量就会相应减少。…

dmol3给定关键字不在字典中_python中的数据结构与算法(2):字典与集合

1. 字典是什么字典是便于信息检索的一种数据结构&#xff0c;鉴于信息检索在程序中无处不在&#xff0c;字典的使用场景也非常广泛&#xff0c;包括许多 python 内部机制的实现&#xff0c;也依赖字典结构&#xff0c;比如命名空间的管理等。检索一般是根据关键字查找与它关联的…

HTTP项目1.0 -- HTTP协议基础知识

一. HTTP之URL篇首先来看一下&#xff0c;我们一般在上网的时候&#xff0c;地址栏中经常会显示的信息&#xff0c;这里就举一些简单的例子https://www.baidu.comhttps://113.2.7.58.25/a/b/c.html从上面的简单的例子我们把url分成了以后的几个部分&#xff0c;请看下图第一个协…

SQL Server 远程无法连接

1. 查看默认1433端口是否已经开启。转载于:https://www.cnblogs.com/jiajinyi/archive/2013/05/21/3091091.html

WCF客户端不能用在Using语句块中,因为它可能会抛出不可预知的异常。即使你捕获了异常,仍有可能一直保持连接。...

WCF客户端不能用在Using语句块中&#xff0c;因为它可能会抛出不可预知的异常。即使你捕获了异常&#xff0c;仍有可能一直保持连接。让我们来看看形成这一问题的历史原因&#xff0c;并提出几个补救措施。 在.NET中&#xff0c;资源管理的基础就是IDisposable和Using语句块。除…

关于 MongoDB 与 SQL Server 通过本身自带工具实现数据快速迁移 及 注意事项 的探究...

背景介绍 随着业务的发展、需求的变化&#xff0c;促使我们追求使用不同类型的数据库&#xff0c;充分发挥其各自特性。如果决定采用新类型的数据库&#xff0c;就需要将既有的数据迁移到新的数据库中。在这类需求中&#xff0c;将SQL Server中的数据导入到MongoDB 中显得尤为突…

语音计算矩形面积_LeetCode85-最大矩形

今天在制作书签的时候突然想到了一个问题如果要送给未来的女朋友一个书签上面该写些什么话哈哈哈哈哈哈哈哈哈The Spring is coming!想了一会儿&#xff0c;觉得这句话最合适To xxx:天使的笑&#xff0c;灿烂的心&#xff01;&#xff01;&#xff01;哎&#xff0c;还是先找个…