类的静态数据成员


有时需要为某个类的所有对象分配一个单一的存储空间。在C语言中,可以用全局变量,
但这样很不安全。全局数据可以被任何人修改,而且,在一个项目中,它很容易与其他的名字
相冲突。如果可以把一个数据当成全局变量那样去存储,但又被隐藏在类的内部,并且清楚地
与这个类相联系,这种处理方法当然是最理想的了。
这一点可以用类的静态数据成员来实现。类的静态成员拥有一块单独的存储区,而不管我
们创建了多少个该类的对象。所有这些对象的静态数据成员都共享这一块静态存储空间,这就
为这些对象提供了一种互相通信的方法。但静态数据属于类,它的名字只在类的范围内有效,
并且可以是p u b l i c(公有的)、p r i v a t e(私有的)或者p r o t e c t e d(保护的)。
1.定义静态数据成员
因为类的静态数据成员有着单一的存储空间而不管产生了多少个对象,所以存储空间必须
定义在一个单一的地方。当然以前有些编译器会分配存储空间,但现在编译器不会分配存储空
间。如果一个静态数据成员被声明但没有定义时,连接器会报告一个错误。
定义必须出现在类的外部(不允许内联)而且只能定义一次,因此它通常放在一个类的实
现文件中。这种规定常常让人感到很麻烦,但实际上它是很合理的。例如
class A{
static int i;
public:
//
};
之后,在定义文件中:
int A::i=1;
在这里,类名和范围分解运算符用于指定了i的范围。
有些人对A : : i是私有的这点感到疑惑不解,还有一些事似乎被公开地处理。这不是破坏了
类结构的保护性吗?有两个原因可以保证它绝对的安全。第一,这些变量的初始化唯一合法是
在定义时。事实上,如果静态数据成员是一个带构造函数的对象时,可以调用构造函数来代替
“=”操作符。第二,一旦这些数据被定义了,终端用户就不能再定义它—否则连接器会报告
错误。而且这个类的创建被迫产生这个定义,否则这些代码在测试时无法连接。这就保证了定
义只出现一次并且它是由类的构造者来控制的。
2.静态数组的初始化
对所有的静态数据成员,我们必须提供一个单一的外部定义。这些定义必须有内部连接,
所以可以放在头文件中。初始化静态数组的方法与其他集合类型的初始化一样,但不能用自动
计数。除此之外,在类定义结束时,编译器必须知道足够的类信息来创建对象,包括所有成员
的精确大小。
class Values{
static const int size;
static const float table[4];
}
const int Values::size=100;
const float Values::table[4]={1.1,1.2,1.3,1.4};
3.局部类中不能有静态数据成员
局部类是在函数内部定义的类,其中不能有静态数据成员
4.静态成员函数
像静态数据成员一样,我们也可以创建一个静态成员函数,它为类的全体服务而不是为一
个类的部分对象服务。这样就不需要定义一个全局函数,减少了全局或局部名字空间的占用,
把这个函数移到了类的内部。当产生一个静态成员函数时,也就表达了与一个特定类的联系。
静态成员函数不能访问一般的数据成员,它只能访问静态数据成员,也只能调用其他的静
态成员函数。通常,当前对象的地址( t h i s)是被隐含地传递到被调用的函数的。但一个静态
成员函数没有t h i s,所以它无法访问一般的成员函数。这样使用静态成员函数在速度上可以比
全局函数有少许的增长,它不仅没有传递t h i s所需的额外的花费,而且还有使函数在类内的好
处。
用s t a t i c关键字指定了一个类的所有对象占有相同的一块存储空间,函数可以并行使用它,
这意味着一个局部变量只有一个拷贝,函数每次调用都使用它。

转载于:https://www.cnblogs.com/dyllove98/p/3172133.html

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

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

相关文章

【Android 13】使用Android Studio调试系统应用之Settings移植(三):构建settingsLib项目目录

文章目录 一、篇头二、系列文章2.1 Android 13 系列文章2.2 Android 9 系列文章2.3 Android 11 系列文章三、AS新建SettingsLib New Moudle3.1 创建 New Moudle3.2 替换源文件(1)选定复制目标(2)复制到AS目录,并改名(3)完成创建四、下一步动作五、篇尾

java虚拟机编译_[四] java虚拟机JVM编译器编译代码简介 字节码指令实例 代码到底编译成了什么形式...

前言简介前文已经对虚拟机进行过了简单的介绍,并且也对class文件结构,以及字节码指令进行了详尽的说明想要了解JVM的运行机制,以及如何优化你的代码,你还需要了解一下,java编译器到底是如何编译你的代码的本文不是从最底层的编译原理讲解本文是针对java代码,去查看归纳总结编译…

提高性能:流的非阻塞处理

1.简介 想象一下,我们有一个需要访问外部Web服务的应用程序,以便收集有关客户端的信息,然后对其进行处理。 更具体地说,我们无法在一次调用中获得所有这些信息。 如果我们要查找不同的客户端,则需要多次调用。 如下图…

通过NAT转发实现私网对外发布信息

我们可以在防火墙的外部网卡上绑定多个合法IP地址,然后通过ip映射使发给其中某一个IP地址的包转发至内部某一用户的WWW服务器上,然后再将该内部WWW服务器响应包伪装成该合法IP发出的包。具体的IP分配如下: (1)该ISP分配…

java支付管理有源码_java支付宝支付案例源码

【实例简介】※运行环境※Eclipse JDK1.6及以上 Tomcat6.0及以上※使用方法※SDK下载地址:https://doc.open.alipay.com/docs/doc.htm?treeId193&articleId103419&docType1第一步;请下载【JAVA版资源】的SDK。第二步:下载完毕后&…

CDI和EJB:在事务成功时发送异步邮件

再一次问好! :) 这次,我选择了一项常见任务,我认为大多数情况下都以错误的方式完成:发送电子邮件。 并非所有人都不知道电子邮件API的工作方式,例如JavaMail或Apache的commons-email 。 我通常看到的一个问题是&#…

SPFILE 、PFILE 的全面解读

这里先阐述一下数据库的启动过程: 1. 启动实例/例程(nomount状态)时,读取参数文件(文本文件PFILE 或服务器参数文件SPFILE),分配SGA、启动后台进程、打开告警文件及后台进程跟踪文件; 2. 装载数据…

JAVA确定这天是这年的某一天_[Java] 练习题014: 输入某年某月某日,判断这一天是这一年的第几天?...

import java.util.*;public class Test014{public static void main(String[] args) throws Exception{int y,m,d;int sum0;int feb28;Scanner in new Scanner(System.in);System.out.print("请输入年份:");y in.nextInt();System.out.print("请输入月份:&quo…

使用默认方法的界面演变–第一部分:方法

几周前,我们详细研究了默认方法 -Java 8中引入的一项功能,该功能允许为接口方法提供实现,即方法主体,从而定义接口中的行为。 引入此功能是为了实现接口演进 。 在JDK的上下文中,这意味着在不破坏所有代码的情况下向接…

java左手握右手_环保型燃料—丙烷(C3H8)曾用于北京奥运会“祥云”火炬燃料,下列有关烷烃的说法不正确的是()A.丙烷分子中三个...

参考答案如下环保会祥【单选题】环境景观设计的核心就是以研究()为基础。型燃下列【判断题】构成中央处理器的两大部件是运算器和存储器。料丙料【单选题】通过下列哪种方式可以获得最强的免疫效果【单选题】根据断面图的标注形式,烷C烷烃下列绘制规范的断面图是【单…

windbg script ---- 禁用IsDebuggerPresent

简单的script r $t0 kernelBase!IsDebuggerPresent; eb $t00x9 31 c0 90 90强制把原代码改成xor eax, eax; nop; nop 注意在xp下,使用kernel32 转载于:https://www.cnblogs.com/hgy413/p/3693400.html

java两个和三个_Java语言基础(day_03)

数据类型中补充的几个小问题1)在定义Long或者Float类型变量的时候,要加L或者f。整数默认是int类型,浮点数默认晨double。byte,short在定义的肘候,他们接收的某实是一个int类型的值。这个是自己做了一个数据检测的,如果…

Hibernate中的JPA 2.1条件删除/更新和临时表

从JPA 2.0版开始, EntityManager提供了方法getCriteriaBuilder()来动态构建选择查询,而无需使用Java持久性查询语言(JPQL)进行字符串连接。 在2.1版中,此CriteriaBuilder提供了两个新方法createCriteriaDelete()和crea…

使用Hamcrest增强JUnit的测试能力

package com.jadyer.service;import java.util.HashMap; import java.util.Map;import org.hamcrest.Matchers; import org.junit.Assert; import org.junit.Test;/*** 使用Hamcrest增强JUnit的测试能力* see Hamcrest框架提供了一些相对通俗并高效的方法来进行一些junit比较困…

在Websphere 8.0上安装Liferay 6.2 Enterprise Edition

为Liferay准备Websphere 当应用服务器二进制文件均已安装完毕,启动WebSphere应用服务器(WAS) 配置文件管理工具来创建一个配置文件适用于Liferay的和遵循的指示说明这里正式Liferay的文档。 这些说明用于在Websphere 8.5上安装Liferay 6.2&am…

java完数流程图_编程基本功训练:流程图画法及练习

对于“程序设计”的工作,许多初学者的理解就是“写代码”。同样,新手们苦恼的问题是,他们只会“写代码”。当接到一个新的任务,不少人总是在第一时间就爬到键盘上去敲代码。敲着敲着,就把自己绕糊涂了。头晕脑胀地坚持…

iOS modal view的关闭和显示问题

今天遇到一个问题: 需要关闭当前modal view,再present另一个modal view。 如果这么写: [self dismissModalViewControllerAnimated:NO];[self.delegate showBorderDetectionView];执行了第一句,再执行第二句的时候,sel…

西工大java高级网络编程_奥鹏西工大16春《JAVA高级网络编程》平时作业

西工大16春《JV高级网络编程》平时作业一、单选题(共 25 道试题,共 100 分。)1. 假设以tomt为w服务器,在hllopp应用中有一个hllo.jsp,它的文件路径如下: %TOMT_HOM%/wpps/hllopp/hllo/hllo.jsp 那么在浏览器端访问hllo.jsp的URL是()。. http:…

c#导出Excel

问题:用户查询一些数据,需要对页面上的数据生成excel文件。 分析:写文件,用excel进程,或者使用response方法(都是通过网上查资料,个人就理解成这两个) 使用excel进程有一个确定&…

使用Java 8流遍历递归数据结构

Streams API是Java 8中的真正瑰宝,我一直在为它们寻找或多或少的意外用途。 我最近写过有关将它们用作ForkJoinPool门面的文章 。 这是另一个有趣的例子:遍历递归数据结构。 事不宜迟,请看一下代码: class Tree {private int va…