关于static 的各种数据类型 及在面向对象编程中的应用

2023-11-19

一、

按存储区域分,全局变量、静态全局变量和静态局部变量都存放在内存静态存储区域,局部变量存放在内存的栈区。 

1定义全局静态变量的好处:


<1>不会被其他文件所访问,修改

<2>其他文件中可以使用相同名字的变量,不会发生冲突。
 
2在局部变量之前加上关键字static,局部变量就被定义成为一个局部静态变量。
(1)和全局静态变量一样都在静态存储区域
(2)初始化:未经初始化的全局静态变量和局部静态bianlian会被程序自动初始化为0(自动对象的值是任意的,除非他被显示初始化)
注:当static用来修饰局部变量的时候,它就改变了局部变量的存储位置,从原来的栈中存放改为静态存储区。但是局部静态变量在离开作用域之后,并没有被销毁,而是仍然驻留在内存当中,直到程序结束,只不过我们不能再对他进行访问。 
3 静态函数

  在函数的返回类型前加上关键字static,函数就被定义成为静态函数。

  函数的定义和声明默认情况下是extern的,但静态函数只是在声明他的文件当中可见,不能被其
存储说明符auto,register,extern,static,对应两种存储期:自动存储期和静态存储期。 
auto和register对应自动存储期。具有自动存储期的变量在进入声明该变量的程序块时被建立,它 在该程序块活动时存在,退出该程序块时撤销。
关键字extern和static用来说明具有静态存储期的变量和函数。用static声明的局部变量具有静态
存储持续期(static storage duration),或静态范围(static extent)。虽然他的值在函数 调用之间保持有效,但是其名字的可视性仍限制在其局部域内。静态局部对象在程序执行到该对象的 声明处时被首次初始化。(摘自《C++ Primer》 P337)
二 面向对象程序设计中的static

1. 静态数据成员

   1) 内存中的位置:静态存储区

   2) 初始化和定义:

       <1> 静态数据成员定义时要分配空间,所以不能在类声明中定义。

       <2> 静态数据成员在程序中只能提供一个定义,所以静态数据成员的初始化不能在类的头文
件中。

   3)  访问:

       <1> 类对象名.静态数据成员

       <2> 类类型名::静态数据成员
 
   4) 说明:

       a.static数据成员和普通数据成员一样遵public, protected, private 访问规则。

       b.对于非静态数据成员,每个类对象都有自己的拷贝。静态数据成员被当作类的全局对象,
无论这个类的对象被定义了多少个,静态数据成员在程序中也只有一份拷贝,由该类类型的所有对象 共享访问。 

   5) 同全局对象相比,使用静态数据成员有两个优势:

       <1> 静态数据成员没有进入程序的全局名字空间,因此不存在与程序中其他全局名字冲突的
可能性。

       <2> 可以实现信息隐藏。静态成员可以是private成员,而全局对象不能。

   6) 应用:

class Account {
    Account( double amount, const string &owner );
    String owner() { return _owner ;}
  private:
    static double _interestRate;
    double _amount;
    string _owner;
};
 
为什把_interestRate声明为static,而_amount和_owner不呢?
这是因为每个Account对应不同的主人,有不同数目的钱,而所有Account的利率却是相同的。

因为在整个程序中只有一个_interestRate数据成员,他被所有Account对象共享,所以把
_interestRate声明为静态数据成员减少了每个Account所需的存储空间。

_interestRate值可能变化,所以不能声明为const。因为_interestRate是静态的,所以它只需要
更新一次我们就可以保证每个Account对象都能访问到更新后的值。要是每个类对象都维持自己的一 个拷贝,那么每个拷贝都必须更新,这将导致效率低下和更大的错误可能。

  
  7)静态数据成员的“唯一性”本质(独立于类的任何对象而存在的唯一实例),使他能够以独特
的方式被使用,这些方式对于非static数据成员来说是非法的。

     <1> 静态数据成员的类型可以是其所属类,而非static数据成员只能被声明为该类对象的指针
 
class Bar{
  public:
    //...
  private:
    static Bar mem1; //OK
    Bar *mem2;  //OK
    Bar mem3;  //错误
};
 
     <2> 静态数据成员可以被作为类成员函数的缺省实参,而非static数据成员不可以。例如:
 
extern int var;
class Foo {
  private:
    int var;
    static int stcvar;
  public:
    //错误:被解析为非static的Foo:var
    //没有相关的类对象
    int mem1( int = var );
    //OK:解析为static的Foo:stcvar
    //无需相关的类对象
    int mem2( int = stcvar );
    //OK:int var 的全局实例
    int mem3( int = ::var );
};
 
  8) 类模板的静态数据成员以后讨论^-^
 
2. 静态成员函数

  1) 声明:在类的成员函数返回值之前加上关键字static,他就被声明为一个静态成员函数。静

  2) 定义:出现在类体外的函数定义不能指定关键字static。

  3) 作用:主要用于对静态数据成员的操作

  4) 静态成员函数与类相联系,不与类的对象相联系。

  5) 静态成员函数不能访问斐静态数据成员。因为非静态数据成员属于特定的类实例。

  6) 静态成员函数没有this指针,因此在静态成员函数中隐式或显示的引用这个指针都将导致编
态成员函数不能声明为const或volatile,这与非静态成员函数不同。 译时刻错误。试图访问隐式引用this指针的非静态数据成员也会导致编译时刻错误。

  7) 访问:可以用成员访问操作符(.)和箭头(->)为一个类对象或指向类对象的指针调用静态成员
函数,也可以用限定修饰符名直接访问或调用静态成员函数,而无需声明类对象
或引用,例如:
他文件所用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于static 的各种数据类型 及在面向对象编程中的应用 的相关文章

  • 将按钮控件嵌入到现有 Direct3D 应用程序中

    我想将自己的内容覆盖在 Direct3D v9 游戏 由第三方制作 之上 叠加互动按钮 具体来说 我想覆盖一个可点击的按钮控件 就像 Steam 所做的那样 尽管我正在尝试一个更简单的界面 理想情况下 我能够覆盖 WPF 按钮或 Windo
  • 浮点等于的意外结果

    问题不在于为什么0 1 0 9不等于1 0 这是关于平等者的不同行为 有人可以解释为什么下面的示例的工作方式不同 float q 0 1f float w 0 9f float summ q w q w 1 0f False summ 1
  • 为什么json序列化器不符合多态性?

    我在 NET 4 5 Windows 应用商店应用程序中使用库存 JSON 序列化器 System Runtime Serialization Json DataContractJsonSerializer 我有一个由 API 提供商提供的
  • 如何使用 ASP.Net Core Identity 从登录用户检索 Google 个人资料图片?

    好的 我目前正在使用 ASP NET Core 1 1 2 和 ASP NET Core Identity 1 1 2 其中重要的部分是启动 cs看起来像这样 public void Configure IApplicationBuilde
  • 类似于 Active Directory 中的搜索

    我正在使用 C 中的以下代码搜索 LDAP 以轮询用户的活动目录 DirectoryEntry entry new DirectoryEntry ldapPath userName password DirectorySearcher Se
  • 从 GetLastError() 函数返回的错误代码中获取文本

    我需要获取从 GetLastError 函数获得的错误代码的文本 我看到了一些示例 但我想要一个获取代码并返回字符串的函数 谢谢大家 我猜你想要这样的东西 DWORD dwLastError GetLastError TCHAR lpBuf
  • 删除 QComboBox“下拉”动画

    我正在使用 Qt 4 8 并且想在单击 QComboBox 时摆脱 下拉 动画 我也想稍微移动一下 到目前为止 我一直在考虑重新实现 showPopup 和 hidePopup 但不知道如何使其工作 此外 每次我尝试使用 CSS 进行移动或
  • 了解 Windows 8 上的文件何时发生更改

    我知道 FileSystemWatcher 类在 Windows 8 上不起作用 为什么在 Windows 7 上检测到 FileSystemWatcher 属性更改 而在 Windows 8 上检测不到 https stackoverfl
  • 用于生成 C++ 代码轮廓/图的工具 - 有这样的东西吗? [复制]

    这个问题在这里已经有答案了 我需要深入研究用 C 编写的软件组件并对其进行一些修改 我幻想生成一些代码映射 它将显示类之间的关系并引导我完成方法的流程 调用图 有这个工具吗 几年前 我使用 Rational Rose 建模工具 该工具具有对
  • Control.Invoke 在隐藏的 ShowDialog 中“卡住”

    我有解决这个问题的方法 但这不是我第一次被咬 所以我试图确切地了解发生了什么 从我的申请中 我ShowDialog表单 表单上有一个按钮 单击该按钮时会调用另一个 非 GUI 线程上的代码 非 GUI 线程发回状态 Pushed then
  • 运行时动态转换

    有没有一种方法可以在运行时动态转换 如以下伪代码 foreach DataRow row in table Rows foreach DataColumn col in table Columns if row col DBNull Val
  • 从 C++ 中的 std::string 获取字节

    我正在一个 C 非托管项目中工作 我需要知道如何获取像 一些要加密的数据 这样的字符串并获取一个 byte 数组 我将用它作为加密的源 在 C 中我做 for int i 0 i lt text Length i buffer i byte
  • 如何使用 Moq 模拟 Web 服务调用?

    The using下面点击了我不想实际点击的外部资源 我想测试someResult以及使用它的代码 但每次我运行单元测试时 该代码仍然尝试访问真正的 Web 服务 如何使用最小起订量来伪造对 Web 服务的真实调用 但不模拟使用中的其余代码
  • 函数的动态返回类型

    如何创建一个具有基于参数类型的动态返回类型的函数 Like protected DynamicType Test DynamicType type return 为此 您必须使用泛型 例如 protected T Test
  • 第一个字母改为大写

    是否有其他版本可以使每个字符串的第一个字母大写 并且对于 flac perl 也使用 FALSE name lt hallo gsub alpha U 1 name perl TRUE 你可以尝试这样的事情 name lt hallo pa
  • 私有静态方法有必要吗?

    原理工程师 https stackoverflow com users 201787 metal在我上一家公司有一条规则private static方法应该作为实现文件中的函数实现 而不是作为类方法 我不记得他的规则是否有任何例外 我在目前
  • Eclipse 调试模式下的 GDB 找不到 stdlib/rand.c

    我试图让 gdb 在 ubuntu 上与 eclipse cdt 一起运行 以开始调试一些简单的程序 所以我做了我认为必要的步骤来让它运行 1 创建可执行项目 2 Compile 3 Run 4 创建文件 gdbinit 并将其放在主项目文
  • 无法加载文件或程序集“SharpSvn”或其依赖项之一。尝试加载格式不正确的程序

    我刚刚在这里下载了 64 位版本的 SharpSVNthe link http sharpsvn open collab net files documents 180 5570 SSvn 1 7002 1998 x64 zip 当我运行我
  • 如何只应用一种 clang-format 操作?

    我想用clang 格式调整我的评论 但仅此而已 选项是 AlignTrailingComments bool 但是当我运行以下命令时 clang format 3 6 i style AlignTrailingComments true
  • C 中的静态和外部内联函数[重复]

    这个问题在这里已经有答案了 我正在尝试详细了解静态函数和外部函数之间的区别 我知道静态内联函数和外部内联函数之间的基本区别 我的理解如有错误请指正 静态内联函数仅对定义它的翻译单元可见 外部内联函数可以在多个翻译单元中访问 最好在头文件中定

随机推荐

  • window系统消失的c盘,实际占用与显示占用相差好多G

    问题 C盘一直显示的红色提醒 我c盘实际占用的空间只有33 1GB 而我的c盘总共大小是59 9GB 显示的剩余大小是1 35GB 也就是说我占用了58 11 和c盘的总文件大小相差了25GB 那么消失的25GB去了哪里 我百度过这个问题
  • 如何用微信自动添加wifi连接服务器地址,微信服务号如何实现扫码自动连接WIFI?详细步骤介绍!...

    微信服务号如何实现扫码自动连接WIFI 详细步骤介绍 有的朋友在运营这个微信公众号的时候 会想着如果有更多人关注自己的运营号就好了 但有的朋友没有找到好的办法 不知道如何吸引更多人的关注 下面小编给大家提供一个思路 就是当大家在关注微信公众
  • 移动端证件识别OCR

    证件识别利用的是ocr识别原理 也就是光学字符识别 证件识别方法有很多 先说第一种 用一个读港澳通行证的仪器就行 而且连上系统还能直接把信息导出成EXCEL文档 其实这个仪器叫做证件识别仪 可以识别护照 港澳通行证 台胞证 身份证 驾驶证
  • python pyplot logscale 画图对数

    原文来自公众号 工程师看海 事情的起因是我要在公众号 工程师看海 更新一篇文章 介绍电感 磁珠的区别 需要画阻抗 频率曲线 横坐标频率要按照log对数尺度缩放 就写了python代码 废话不多说 先看结果 公众号后台回复 python lo
  • 【Xilinx DDR3 MIG】Xilinx FPGA DDR3读写实验相关用户接口引脚解释

    目录 DDR3读写实验 实验框图 时钟模块 DDR3读写及LED指示模块 MIG IP核 用户接口解释
  • Python自定义异常 Python Custom Exception

    个人主页 Aurora 如果文章有什么需要改进的地方还请各位大佬指正 如果我的文章对你有帮助 关注 点赞 收藏 一 python自定义异常 1 自定义一个CustomException类 继承Exception类 2 编写CustomExc
  • cur.execute(sql,args)和cur.execute(sql)的区别

    python代码示例 方式一 userid 123 sql select id name from user where id s userid cur execute sql 方式二 sql语句模板中的参数填充符是 s 而不是 s 且多个
  • Linux上开发常见问题整理

    Linux上开发常见问题整理 1 java工程在linux上运行测试 首先要有一个main方法作为主类 程序的入口 右键 gt Run As gt javaapplication生成配置文件入口 右键该工程 gt Export gt Run
  • LaTeX 多行公式、公式对齐以及输入矩阵的方法

    一 LaTex显示 大括号连接的 多行公式 公式组合 使用cases环境实现公式的组合 分隔公式和条件 具体LaTex代码如下 D x begin cases lim limits x to 0 frac a x b c x lt 3 pi
  • tshark 解析pcap中带TLS协议的数据包

    tshark的简单用法参考 tshark解析本地pcap数据包提取五元组 src ip src port proto dst ip dst port 与时间戳 包长 详细用法 官方DOC 比如提取一个数据包 my pcap 中全部带有TLS
  • Oracle数据恢复:强制Resetlogs的可能数据损失

    Oracle数据恢复 强制Resetlogs的可能数据损失 Oracle数据恢复 格式化 ASM及字典损坏案例三则 ORA 00600 kcratr nab less than odr案例一则 SMON recover undo segme
  • 简易DOCKER/K8S使用心得

    1 DOCKER安装 1 1 前置环境 首先 如果使用CentOS 你至少需要7 4以上 从内核角度来说 建议使用8 2及以上 如果是7 4以下的版本 可以通过设置仓库到7 4以上版本 再 yum install centos releas
  • 计算机内存数值存储方式-原码、反码、补码、数值溢出

    计算机内存数值存储方式 1 原码 一个数的原码 原始的二进制码 有如下特点 最高位做为符号位 0表示正 为1表示负 其它数值部分就是数值本身绝对值的二进制数 负数的原码是在其绝对值的基础上 最高位变为1 下面数值以1字节的大小描述 原码表示
  • 手把手教你实现一个向量

    文章目录 什么是向量 向量提供哪些接口 实现 宏定义 定义类 成员变量 构造函数与析构函数 构造函数 析构函数 成员函数 size get r put r e expand insert r e remove lo hi remove r
  • nodejs获取时间戳

    可以使用 JavaScript 内置的 Date 对象来获取当前的时间戳 可以使用 Date now 方法来获取当前的时间戳 consttimestamp Date now console log timestamp 也可以使用 Date
  • 轻松掌握Python自动化工具,解锁PyAutoGUI的强大功能

    前言 PyAutoGUI是一个用于图像识别和鼠标 键盘控制的Python库 它提供了一组函数和方法 用于自动化屏幕上的鼠标移动 点击 拖拽和键盘输入 以及执行图像识别和处理 本文旨在帮助读者入门 PyAutoGUI 理解其基础概念和掌握最佳
  • js逆向-国密SM2初探

    目录 前言 目标网站 加密分析 加密定位 结尾 本文仅供学习使用 切勿非法使用 如有侵权请联系作者及时删除 前言 无意中看到一个网站采用国密SM2算法进行登陆参数进行加密 之前接触的加密基本都是国外的算法 例如RSA DES MD5等等 国
  • 13位时间戳单位为毫秒,10位字符串单位为秒。时间戳转换日期数字格式100%全乎

    时间戳转换为年月日时分秒数字格式 注意时间戳有2种 13位时间戳 单位为毫秒 10位字符串 单位为秒 接口返回1616160878418 微秒 期望格式2021 03 19 21 34 35 标签 java new Date 变成GMT G
  • tar打包备份+ubuntu系统的修复

    如果ubuntu系统出问题 通过备份文件可以简单快速地修复ubuntu系统 tar打包十分必要 一 tar打包备份 1 进入管理员账户 sudo su 2 打包 tar cvPzf 20191203ubuntu1804 tgz exclud
  • 关于static 的各种数据类型 及在面向对象编程中的应用

    一 按存储区域分 全局变量 静态全局变量和静态局部变量都存放在内存的静态存储区域 局部变量存放在内存的栈区 1定义全局静态变量的好处 lt 1 gt 不会被其他文件所访问 修改 lt 2 gt 其他文件中可以使用相同名字的变量 不会发生冲突