static

做为类成员
静态数据成员
同全局对象相比,使用静态数据成员有2个优势:
(1)
静态数据成员没有进入程序的全局名字空间,因此不存在与程序中其他全局名字冲突的可能性。
(2)
可以实现信息隐藏。静态成员可以是private成员,而全局对象不能。

初始化:
因为静态数据成员不从属于任何一个具体对象,所以必须对它进行初始化,而且对它的初始化不能在构造函数中进行。
一般地,静态数据成员在该类定义之外被初始化。如同一个成员函数被定义在类定义之外一样,在这种定义中的静态成员的名字必须被其类名限定修饰。

#include <iostream.h>

class Sample

{

       int n;

public:

       Sample(int i) { n=i;}

       void add() { s+=n; }

       static int s;//定义

};

 

int Sample::s=0;//初始化

void main()

{

       Sample a(2),b(5),c(8);

       a.add();

       cout<<"s="<<Sample::s<<endl;

      

       b.add();

       cout<<"s="<<Sample::s<<endl;

      

       c.add();

       cout<<"s="<<Sample::s<<endl;

      

}

 

运行结果:

s=2

s=7

s=15

静态成员函数
静态成员函数没有this指针。

做为非类成员
若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度; 若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度;设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑重入问题;所谓的函数是可重入的(也可以说是可预测的),即:只要输入数据相同就应产生相同的输出。 

//file1.cpp

#include <iostream.h>

 

void fn();

extern int n;//声明

 

void main()

{

       n=20;

       cout<<n<<endl;

       fn();

}

 

//file2.cpp

#include <iostream.h>

static int n;//n是一个静态全局变量,作用域仅在file2

 

void fn()

{

       n++;

       cout<<n<<endl;   

}

 

文件分别编译能通过,但连接时file1.cpp 中的变量n找不到定义,产生连接错误。去掉static int n前的static就可以了。

error LNK2001: unresolved external symbol "int  n" (?n@@ 3HA )

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值