记录点滴成长
随笔 - 6, 文章 - 0, 评论 - 5, 引用 - 0
数据加载中……
static变量和static函数
在C语言编程中,static的一个作用是信息屏蔽!
比方说,你自己定义了一个文件 -- 该文件中有一系列的函数以及变量的声明和定义!
你希望该文件中的一些函数和变量只能被该文件中的函数使用,那么,你可以在该函数、变量的前面加上static,代表他们只能被当前文件中的函数使用!
而在C++中,用static来作为信息屏蔽就显得没有必要了!因为,C++有了信息屏蔽的利器 -- class机制!
类中的private属性的变量和函数就对外禁止访问!
然后是C/C++通用的函数作用域的static型的变量!其目的,也是为了信息的屏蔽!
int fun() {
static int a = 1;
a++;
}
在第一次进入这个函数的时候,变量a被初始化为1!并接着自增1!
以后每次进入该函数,a就不会被再次初始化了,仅进行自增1的操作!
在static发明前,要达到同样的功能,则只能使用全局变量:
int a = 1;
int fun() {
a++;
}
那么,a的值就有可能被其他函数所改变!
最后,说说类中的static变量和函数。
这种存储属性的变量和函数是同一种类的不同实例之间通信的桥梁!
#include <iostream>
using namespace std;
class A {
public:
static int num; // 统计创建了多少个实例
A () {num++}; // 每创建一个实例,就让num自增1
// 返回通过构造函数所创建过的A类实例的数目
static int how_many_instance() {
return num;
}
}
static A::num = 0; // 需要在类申明的外部单独初始化!
int main() {
cout << A::how_many_instance() << endl;
A a, b, c, d;
cout << A::how_many_instance() << endl;
system("pause");
}
一般,在类内部,是通过static属性的函数,访问static属性的变量!
补充一点,在类中,static型的成员函数,由于是类所拥有的,而不是具体对象所有的,这一点对于windows的回调机制非常有用。
因为对于回调函数而言,windows不会借助任何对象去调用它,也就不会传递this指针,那么对于一般成员函数作为回调函数的后果,就是堆栈中有一个随机的变量会成为this指针,这当然会引发程序的崩溃。
而static函数,由于是整个类的,屏蔽了this指针。因此,如果成员函数作为回调函数,就应该用static去修饰它。
(引用,原文:
http://www.cppblog.com/dbkong/archive/2009/03/02/16169.html
)
posted on 2009-03-26 12:05
qhmao
阅读(398)
评论(0)
编辑
收藏
引用
只有注册用户
登录
后才能发表评论。
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
网站导航:
博客园
IT新闻
BlogJava
知识库
博问
管理
Powered by:
C++博客
Copyright © qhmao
导航
C++博客
首页
新随笔
联系
聚合
管理
<
2009年5月
>
日
一
二
三
四
五
六
26
27
28
29
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
常用链接
我的随笔
我的评论
我参与的随笔
留言簿
给我留言
查看公开留言
查看私人留言
随笔档案
2009年8月 (1)
2009年5月 (1)
2009年4月 (3)
2009年3月 (1)
C++ 基础知识
Qt
VC++
搜索
最新评论
1. re: VC.net 2005找不到MSVCR80D.dll的完美解决方案
评论内容较长,点击标题查看
--cppx
2. re: const * * const
评论内容较长,点击标题查看
--qhmao
3. re: const * * const
评论内容较长,点击标题查看
--qhmao
4. re: const * * const
评论内容较长,点击标题查看
--qhmao
5. re: const * * const
评论内容较长,点击标题查看
--qhmao
阅读排行榜
1. g++ Hello World (686)
2. const * * const(664)
3. UltraEdit的文件标签不见了.(654)
4. VC.net 2005找不到MSVCR80D.dll的完美解决方案(650)
5. gdb和g++的简单使用(613)
评论排行榜
1. const * * const(4)
2. VC.net 2005找不到MSVCR80D.dll的完美解决方案(1)
3. static变量和static函数 (0)
4. UltraEdit的文件标签不见了.(0)
5. g++ Hello World (0)