一:什么是静态对象?
    对象的存储方式是静态的。
       局部静态对象和类的静态对象。

    
局部静态对象:一个变量在函数内部定义,其生命周期跨越了该函数的多次调用。局部对象确保不迟于在程序执行流第一次经过该对象的定义语句时进行初始化。这样的对象一旦被创建,在程序结束之前都不会销毁。在定义局部静态对象的函数执行完毕后,该静态对象不会撤销。当该函数被多次调用的过程中,静态局部对象会持续存在并保存它的值。

静态成员对象:静态成员对象存储在全局存储区,静态成员对象的作用域在类的作用域中。其可以避免与其他类成员或全局对象名字冲突。可以封装为私有的,而全局对象不可以。

二:定义及初始化
       允许对构造类静态局部量赋初值。若未赋以初值,则由系统自动赋值。数值型变量自动赋初值0,字符型变量赋空字符。对基本类型的静态局部变量若在说明时未赋以初值,则系统自动赋予0值。而对自动变量不赋初值,则其值是不定的。

  • 局部静态对象:
  1. int fun(int i)
  2. {
  3. static int a = 10;
  4. a = a+i;
  5. return a;
  6. }
  7. int main(int argc, char *argv[])
  8. {
  9. for(int i=0;i<3;i++)
  10. {
  11. cout <<fun(i)<<endl;
  12. }
  13. }

  • 静态类成员对象
声明:类的静态成员变量声明前加static,其也遵守公有/私有访问规则。因为 static 成员不是任何对象的组成部分,所以不能通过构造进行初始化。应该单独进行定义并进行初始化。
  1. class Account {
  2. public:
  3. // interface functions here
  4. void applyint() { amount += amount * interestRate; }
  5. static double rate() { return interestRate; }
  6. static void rate(double); // sets a new rate
  7. private:
  8. std::string owner;
  9. double amount;
  10. static double interestRate;
  11. static double initRate();
  12. };
    这个类的每个对象具有两个数据成员:owner 和 amount。对象没有与
    static 数据成员对应的数据成员,但是,存在一个单独的 interestRate 对象,
    由 Account 类型的全体对象共享。
    static 数据成员必须在类定义体的外部定义(正好一次)。不像普通数据成员,static 成员不是通过类构造函数进行初始化,而是应该在定义时进行初始化。

定义:在函数定义的文件中进行定义,定义的格式:  
            类型名  类名::对象名=值;(前面不能再有static,static 关键字只能用于类定义体内部的声明中)
  1. double Account::interestRate = initRate();
这个语句定义名为 interestRate 的 static 对象,它是类 Account 的成员,为 double 型。作用域符后面的表明都是在该类的作用域下,因此可以直接使用initRate()函数。注意,虽然initRate是私有的,我们也能用它初始化interestRate。和其他的成员一样,interestRate的定义也可以在访问类的私有成员。
访问/调用:
在该变量所属类的成员函数里直接可以使用,在其他文件中通过
类名::函数名/变量

三、全局静态对象与全局变量的区别
    全局变量前面加上static就变成了全局变量。全局变量本身就是静态存储方式,静态全局变量也是静态存储方式。两者的区别是,非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态全局变量在各个源文件中均可访问。而静态全局变量只有在定义该静态全局变量的文件中可用,在同一源程序的其他源文件中不可访问。因此可避免在其他源文件中的引起错误。
      把局部变量变为静态变量后,改变了其生命周期。把全局变量变为静态全局变量,改变了其作用域,限制了其使用范围。

四、应用
       static成员变量最经典的用法就是设计模式中的单例模式了。在下篇文章中,我会指出单例模式的三种写法,及其优缺点。


        

C++ 静态对象的更多相关文章

  1. AppDomain对于静态对象的独享引用

    AppDomain可以理解为一个独立的沙箱,当有独立的第静态对象在appDomain中被访问时,会在appDomain中产生独立的内存对象.比如appDomain1 appDomain2同时对 静态对 ...

  2. Lind.DDD.Utils.HttpHelper里静态对象引出的Http超时问题

    回到目录 Lind.DDD.Utils.HttpHelper组件主要实现了对HTTP的各种操作,如Get,Post,Put和Delete,它属于最纯粹的操作,大叔把它封装的目的主要为了实现与API安全 ...

  3. 十四、Android学习笔记_Android回调函数触发的几种方式 广播 静态对象

    一.通过广播方式: 1.比如登录.假如下面这个方法是外界调用的,那么怎样在LoginActivity里面执行登录操作,成功之后在回调listener接口呢?如果是平常的类,可以通过构造函数将监听类对象 ...

  4. spring学习——注入静态对象属性

    spring注入静态对象属性时,因为虚拟机类加载问题,直接在属性上使用@Autowired 是不可以的.需要在属性对应的set方法上@Autowired,并且,set方法不能定义为static. 1. ...

  5. 在QT中使用静态对象

    最近做教研室的项目,需要只能存在一个接收数据的线程,那么我就想把这个线程设置成一个静态对象.但是在connect信号与槽的时候出了一点问题,最后搞好了,现在这mark一下: 比如说一个声明了一个静态的 ...

  6. 自动对象&局部静态对象

    一.关键点 对象的生命周期:程序执行过程中,该对象存在的那段时间 局部对象:形参.函数体内部定义的变量 二.自动对象 自动对象:只存在于块执行期间的对象 包括:局部变量.形参 三.局部静态对象 特点: ...

  7. Android学习笔记_74_Android回调函数触发的几种方式 广播 静态对象

    一.通过广播方式: 1.比如登录.假如下面这个方法是外界调用的,那么怎样在LoginActivity里面执行登录操作,成功之后在回调listener接口呢?如果是平常的类,可以通过构造函数将监听类对象 ...

  8. Spring整合JUnit spring静态对象属性的注入

    package cn.itcast.d_junit4; import org.junit.Test; import org.junit.runner.RunWith; import org.sprin ...

  9. 全面解析RayFire的动态对象与静态对象

    我们在日常使用RayFire的过程中,接触得比较多的应该就是RayFire的对象设置了.RayFire的对象包含了动态对象.静态对象与休眠对象,其中动态对象.静态对象可以结合动力学.运动学概念设置动作 ...

随机推荐

  1. 如何理解 if __name__ == "__main__"

    小明.py 朋友眼中你是小明(__name__ == '小明'), 你自己眼中你是你自己(__name__ == '__main__'), 你编程很好, 朋友调你去帮他写程序(import 小明, 这 ...

  2. css悬浮在页面顶端

    .header{ position:fixed; margin-top:; width:%; z-index:; } .body{ position:relative; padding-top:119 ...

  3. window.location 对象中各种方法的用途

    一.简介 属性 描述 hash 从井号 (#) 开始的 URL(锚) host 主机名和当前 URL 的端口号 hostname 当前 URL 的主机名 href 完整的 URL pathname 当 ...

  4. golang中net/http包的简单使用

    一.介绍 http包提供了http客户端和服务端的实现 Get,Head,Post和PostForm函数发出http.https的请求 程序在使用完回复后必须关闭回复的主体 #简单的访问网站,由于没有 ...

  5. 求N!中素数的个数

    int degree_in_fact(int n, int x)//求n!中素数x的次数 { if(m) return degree_in_fact(n/x,x)+n/x; ; }

  6. Python sort()函数和sorted()

    1.原址排序 1)列表有自己的sort方法,其对列表进行原址排序,既然是原址排序,那显然元组不可能拥有这种方法,因为元组是不可修改的. truple无组报错: 2.副本排序 1)[:]分片方法 注意: ...

  7. Eclips安装STS(Spring Tool Suite (STS) for Eclipse)插件

    Spring Tool Suite(sts)就是一个基于Eclipse的开发环境, 用于开发Spring应用程序.它提供了一个现成的使用环境来实现, 调试, 运行, 和部署你的Spring应用程序.包 ...

  8. selenium基础(获取验证信息-断言)

    获取验证信息 实际结果与预期结果进行比较称之为断言 通过获取title.URL.text等信息进行断言 text方法用于获取标签对之间的文本信息 from selenium import webdri ...

  9. Nginx 教程 2:性能

    为了获得更好的学习效果,我们建议你在本机安装 Nginx 并且尝试进行实践. tcp_nodelay, tcp_nopush 和 sendfile tcp_nodelay 在 TCP 发展早期,工程师 ...

  10. 编译安装redis-3.2.9(latest stable version)

    What is the Redis? Redis is an open source (BSD licensed), in-memory data structure store, used as a ...