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

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

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

二:定义及初始化
       允许对构造类静态局部量赋初值。若未赋以初值,则由系统自动赋值。数值型变量自动赋初值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. 使用Fiddler模拟弱网络环境测试

    https://blog.csdn.net/swordgirl2011/article/details/51765237 https://www.cnblogs.com/longronglang/p/ ...

  2. day22_4-pickle模块

    # 参考资料:# python模块(转自Yuan先生) - 狂奔__蜗牛 - 博客园# https://www.cnblogs.com/guojintao/articles/9070485.html ...

  3. HUD1686-Oulipo-kmp模板题/哈希模板题

    The French author Georges Perec (1936–1982) once wrote a book, La disparition, without the letter 'e ...

  4. 夏令营501-511NOIP训练16——数字转换

    传送门:QAQQAQ 题意:如果一个数x的约数和(不包括它本身,下同)比它本身小,那么x可以变成它的约数和:如果对于某个y>x且y的约数和为x,那么x也可以变成y.例如,4可以变为3,1可以变为 ...

  5. ERROR 1839 (HY000): @@GLOBAL.GTID_PURGED can only be set when @@GLOBAL.GTID_MODE = ON

    从cdb上dump一个库结构,准备与本地结构做对比(可以直接compare,但速度贼慢).使用dump脚本在本地创建的时候报错 -- 导出指定库的结构 shell> mysqldump -hxx ...

  6. <爬虫>黑板爬虫闯关02

    import requests from lxml import etree ''' 黑板爬虫闯关02 网址:http://www.heibanke.com/lesson/crawler_ex01/ ...

  7. P1020 导弹拦截 /// DP Dilworth定理 LIS、LDS优化

    题目大意: https://www.luogu.org/problemnew/show/P1020 Dliworth有两个互相对偶的定理:U的链划分使用的最少集合数,等于它的最大反链长度.(1)U的反 ...

  8. 【学术篇】状态压缩动态规划——POJ3254/洛谷1879 玉米田Corn Field

    我要开状压dp的坑了..直播从入门到放弃系列.. 那就先拿一道状压dp的水题练练手吧.. 然后就找到了这一道..这道题使我清醒地认识到阻碍我的不是算法,而是视力= = 传送门: poj:http:// ...

  9. 学习 debug

    要在代码编辑器中设置源代码断点,有以下 4 种操作方式. (1) 把光标移到要设为断点的行上,按下 F5 键. (2) 用鼠标左键单击要设为断点的行的最左端. (3) 用鼠标右键单击要设为断点的行,在 ...

  10. LoadRunner函数的介绍

    LoadRunner函数的介绍 LoadRunner函数 一:通用函数 LoadRunner的通用函数以lr为前缀,可以在任何协议中使用.可以如下分类: 信息相关的函数: lr_error_messa ...