Static的应用
来源:互联网 发布:java入门与实战教程 编辑:程序博客网 时间:2024/06/06 00:27
在C++中,static的字面意思很容易把我们导入歧途,其实它的作用有4条。
(1)先来介绍它的第一条也是最重要的一条:隐藏。
当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。为理解这句话,我举例来说明。我们要同时编译两个源文件,一个是a.cpp,另一个是main.cpp。
下面是a.c的内容
char a = 'A'; // global variable
void msg()
{
printf("Hello/n");
}
下面是main.c的内容
int main(void)
{
extern char a; // extern variable must be declared before use
cout<<a<<endl;
extern void msg();
msg();
return 0;
}
程序的运行结果是:
A Hello
你可能会问:为什么在a.cpp中定义的全局变量a和函数msg能在main.cpp中使用?前面说过,所有未加static前缀的全局变量和函数都具有全局可见性,其它的源文件也能访问。此例中,a是全局变量,msg是函数,并且都没有加static前缀,因此对于另外的源文件main.cpp是可见的。
如果加了static,就会对其它源文件隐藏。例如在a和msg的定义前加上static,main.cpp就看不到它们了。利用这一特性可以在不同的文件中定义同名函数和同名变量,而不必担心命名冲突。Static可以用作函数和变量的前缀,对于函数来讲,static的作用仅限于隐藏,而对于变量,static还有下面两个作用。
(2)static的第二个作用是保持变量内容的持久。存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。共有两种变量存储在静态存储区:全局变量和static变量,只不过和全局变量比起来,static可以控制变量的可见范围,说到底static还是用来隐藏的。虽然这种用法不常见,但我还是举一个例子。
#include <iostream>
using namespace std;
int fun(void){
static int count = 10; // 事实上此赋值语句只执行过一次
return count--;
}
int count = 1;
int main(void)
{
cout<<"global/t/t"<<"local static/n";
for(; count <= 10; ++count)
cout<<count<<"/t/t"<<fun()<<endl;
return 0;
}
程序的运行结果是:
global local static
1 10
2 9
3 8
4 7
5 6
6 5
7 4
8 3
9 2
10 1
(3)static的第三个作用是默认初始化为0。其实全局变量也具备这一属性,因为全局变量也存储在静态数据区。在静态数据区,内存中所有的字节默认值都是0x00,某些时候这一特点可以减少程序员的工作量。比如初始化一个稀疏矩阵,我们可以一个一个地把所有元素都置0,然后把不是0的几个元素赋值。如果定义成静态的,就省去了一开始置0的操作。再比如要把一个字符数组当字符串来用,但又觉得每次在字符数组末尾加’/0’太麻烦。如果把字符串定义成静态的,就省去了这个麻烦,因为那里本来就是’/0’。不妨做个小实验验证一下。
#include <iostream>
using namespace std;
int a;
int main(void)
{
static int i;
static char str[10];
cout<<"integer:"<<i;
for(int i=0;i<10;i++)
{
cout<<"str["<<i<<"]"<<" is "<<str[i]<<endl;
}
return 0;
}
程序的运行结果如下
integer: 0;
str[0] is:
str[1] is:
str[2] is:
str[3] is:
str[4] is:
str[5] is:
str[6] is:
str[7] is:
str[8] is:
str[9] is:
最后对static的三条作用做一句话总结。首先static的最主要功能是隐藏,其次因为static变量存放在静态存储区,所以它具备持久性和默认值0。
(4)面向对象的static关键字(类中的static关键字)
1、静态数据成员
在类内数据成员的声明前加上关键字static,该数据成员就是类内的静态数据成员。先举一个静态数据成员的例子。
//Example 5
#include <iostream.h>
class Myclass
{
public:
Myclass(int a,int b,int c);
void GetSum();
private:
int a,b,c;
static int Sum;//声明静态数据成员
};
int Myclass::Sum=0;//定义并初始化静态数据成员
Myclass::Myclass(int a,int b,int c)
{
this->a=a;
this->b=b;
this->c=c;
Sum+=a+b+c;
}
void Myclass::GetSum()
{
cout<<"Sum="<<Sum<<endl;
}
void main()
{
Myclass M(1,2,3);
M.GetSum();
Myclass N(4,5,6);
N.GetSum();
M.GetSum();
}
- Static的应用
- static的应用
- static的顺序应用
- static volatile的应用
- static的应用场景
- static 的应用
- c++中static的应用
- C 中 static 的应用
- static关键字的实际应用
- static与auto的应用
- java之static的应用
- static与全局变量的应用
- static 关键字的应用【代码 6-8】 static.php
- static 应用
- static应用
- 解析static的不恰当应用
- java static 代码块的应用
- java static 代码块的应用
- shell实例(六) ---字符串操作
- 3月8日画颗钻石送给老婆
- MTK添加短信同号删除功能
- Perl默认的内部变量
- 资源网站
- Static的应用
- win7系统下安装xp
- U盘安装windows 7图文教程
- 挑战和机遇并存 Android前景解析
- configure/make/make install的作用
- 将Activity隐藏到后台
- NYOJ43 24点游戏 扩展板 同样利用昨天写的后缀法求值
- 转义字符英文对照表
- ehlib使用内存表的方法