您的位置:首页 > 编程语言 > C语言/C++

C和C++中static作用详解

2013-03-31 17:16 197 查看
C中static的作用大致三种:

首先static的最主要功能是隐藏,其次因为static变量存放在静态存储区,所以它具备持久性和默认值0。

分开来说:

(1)隐藏。这点主要针对静态全局变量和静态函数。对于非静态全局变量的作用域是整个源程序(可能包含多个文件),而静态全局变量则将其作用域限定在本文件内。同理,静态函数也将其作用域限定在本文件内。利用static实现了变量名和函数名的隐藏,从而其他文件内可以有同名函数或变量而不互相影响。static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝。

(2)持久性。主要针对静态局部变量,把局部变量改变为静态变量后,存储到静态存储区,即改变了它的生存期,作用域不变。static局部变量只被初始化一次。

(3)默认初始化为0。因为全局变量本来默认初始化为0,所以主要针对静态局部变量。

C++中static作用:

除了在面向过程设计中兼容C中特性外,C++中增加的含义体现在面向对象程序设计时,此时static表示属于一个类而不是属于此类的任何特定对象的变量和函数(与Java中此关键字的含义相同)。具体的情况为:

(1)类的静态成员变量

在cpp中必须对它进行初始化,如

int Myclass::sum = 0;   //初始化静态数据成员,注意该处没有static

如果变量被声明为static,对象将只在执行线程第一次到达它的定义并初始化。

//oop.h
#include<iostream>
using namespace std;

class Myclass
{
private:
int a , b , c;
static int sum;  //声明静态数据成员
public:
Myclass(int a , int b , int c);
void GetSum();
};
//oop.cpp
#include "oop.h"
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;
}

int main(void)
{
Myclass M(1 , 2 , 3);
M.GetSum();
Myclass N(4 , 5 , 6);
N.GetSum();
M.GetSum();
getchar();
return 0;
}

输出为:6 21 21

(2)类的静态函数

实现的时候也不需要static的修饰;类的静态函数是在该类的范畴内的全局函数,只能访问类的静态成员(变量和函数),不需要类的实例即可调用;实际上,它就是增加了类的访问权限的全局函数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: