参考自文章:http://blog.csdn.net/wpf_ml/article/details/7763534

1. 静态存储

变量定义在函数外或是用static 关键字修饰的变量存放在静态存储区(独立于堆和栈),放在静态存储区的数据在整个程序运行期间持续有效。既然在程序的整个生命周期都存在,这样的好处就是非常容易进行内存管理。

1.1 静态变量可以依据linkage分为以下三类:

(1)  external linkage (2)internal linkage  (3)no linkage

下面例子就是静态变量的不同作用域的示例.

int a= ;
static int b = ;
int main() {}
void f() {
static int c = ;
int d = ;
}

变量d是本地作用域,不能在函数f()以外使用。

变量c是静态的,即使f()函数没有被执行也会存在内存中。c是静态的,可以声明其一次并只能声明一次。(只能在一个文件中定义全局变量。也就是说,只有一个文件能提前声明,其它的文件必需通过extern关键字提供相关声明的引用)

a和b两个变量能从声明位置,到整个文件结束都能被访问到。但a能在其它文件中使用因为其默认为 external linkage。

特殊的例子:const 全局变量

const int a = ;
int main() { ....

一个全局变量默认是external linkage,一个const的全局变量默认是internal linkage

如果我们想使constant变量有external linkage,我们可以用extern关键字声明来代替默认的inernal linkage:

Extern const  int a = 20;

1.2 初始化

(1)为初始化的变量设置为0 (2) 初始化静态变量只能是固定表达式 ????

int x;               // x set to 0
int y = ; // 50 is literal constant
int z = sizeof(int); // sizeof ok
int zz = * x; // not allowed, x is not constant ? VS2010可以通过

2.  静态类成员

静态成员是作为这个类的成员而不是这个类的每一个实例存在。所以关键字this不能在静态成员中使用。

静态函数只能使用静态的数据成员。

整个类中静态成员只有一个实例,通常在实现源文件中被初始化。因为声明只是告诉编译器多少内存被申请,而不进行申请操作.我们只有在建立对象时才进行内存的申请及初始化。

但是在类的声明里面可以初始化const或 enumeration类型的静态成员:

#include <iostream>
class Car
{
enumColor {silver = , maroon, red };
intyear;
intmileage = ; //error: not-static data members
// only static const integral data members
// can be initialized within a class
static int vin = ; // error:non-constant data member
// only static const integral data members
// can be initialized within a class
static const string model = "Sonata"; // error: not-integral type VS2010实测,编译会报错,提示 only static const integral data members can be initialized within a class // can not have in-class initializer
         static const int engine = ;           //allowed: static const integral type
};
int Car::year = ; // error: non-static data members
// cannot be defined out-of-class
int main()
{
return0;
}

3. 静态成员函数

(1) 一个静态成员函数只能访问静态数据,静态函数及类外的数据和函数。所以我们必需注意不要向非静态成员一样使用静态成员函数,非静态函数能访问所有的静态数据成员。

(2)一个非静态函数只能在类对象初化时才能被调用。而静态数据成员可以在类没有初始化时就可以被调用。

(3)  一个非静态函数可以被声明为virtual但静态数据成员不能声明为virtual.

4. 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. C++ 静态对象

    一:什么是静态对象?     对象的存储方式是静态的.        局部静态对象和类的静态对象.      局部静态对象:一个变量在函数内部定义,其生命周期跨越了该函数的多次调用.局部对象确保不迟于 ...

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

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

随机推荐

  1. mysql在高内存、IO利用率上的几个优化点 (sync+fsync) 猎豹移动技术博客

    http://dev.cmcm.com/archives/107 Posted on 2014年10月16日 by liuding | 7条评论 以下优化都是基于CentOS系统下的一些优化整理,有不 ...

  2. java 类型转换:

    数值数据类型: 1.自动类型转换 byte->short ->int->long-->float--->double 范转小的类型向范围大的类型号转换,由系统自动完成   ...

  3. 试答卓同学的 iOS 面试题

    卓同学昨天写了一篇文章<4道过滤菜鸟的iOS面试题>.我手痒决定默写一个参考答案.后来发现不认真回答被大家喷成狗,所以决定积极改造,重新做人.下面就是修编之后的答案. 1. struct和 ...

  4. Android 高仿微信实时聊天 基于百度云推送

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38799363 ,本文出自:[张鸿洋的博客] 一直在仿微信界面,今天终于有幸利用百 ...

  5. Java中Long与long的区别(转)

    Java中Long与long的区别(转) [本文转载自:http://www.cnblogs.com/bluestorm/archive/2012/04/22/2464739.html] 转载请联系原 ...

  6. MyBatis 学习总结(二)

    1.MyBatis基础环境的搭建 1.1 核心配置文件mybatis-config.xml <?xml version="1.0" encoding="UTF-8& ...

  7. zabbix图中出现中文乱码问题

    我这周部署了zabbix监控服务器,但是配置过程中发现当有中文时,图中的中文会变成方块 如下图所示: 这个问题是由于zabbix的web端没有中文字库,我们最需要把中文字库加上即可 解决办法如下 1. ...

  8. mac 卸载java

    由于电脑上的jdk版本和项目组使用的版本不一致,因此需要卸载,但是作为一个新人小白加没有使用mac的过多经验,还是稍微费了一些些功夫的,从网上查的资料,终于解决这个问题,因此记录一下. 参考博客:ht ...

  9. Python之路,Day16 - Django 进阶

    Python之路,Day16 - Django 进阶   本节内容 自定义template tags 中间件 CRSF 权限管理 分页 Django分页 https://docs.djangoproj ...

  10. 进程外session(session保存在sqlserver)

    .Session保存在SQLServer中配置方法 )运行.NetFramework安装目录下对应版本的aspnet_regsql.exe 来创建相关的数据库.表和存储过程等,比如: C:\Windo ...