static关键字的用法

来源:互联网 发布:金山快译怎么汉化软件 编辑:程序博客网 时间:2024/05/19 23:24

c语言中static关键字有两种用法
1、修饰局部变量
a)地址在全局区,
b)只有第一次进入函数时初始化;
c)生命期在离开main函数之后结束;
d)每次进入函数时不重新初始化,保留进入函数之前的数值。

2、修饰全局变量,避免文件间相同变量名冲突
a)普通全局变量可以跨文件用extern关键字来引用;
b)static全局变量不可以用extern关键字来跨文件调用;
c)加了static关键字修饰,不同源文件之间可以有同名的全局变量;
d)static全局变量的含义是本源文件专用,或者叫本文件私有变量;

c++中,除了以上两种用法,还可以用static关键字来修饰成员变量或成员函数,
被static修饰的成员变量具有以下性质,
1、独立于类的对象存在,其地址在全局区
2、访问该类型成员变量需在类外重新进行定义性声明
3、不影响类的大小

被static修饰的成员函数具有以下性质:
1、没有隐含的this指针,因而不能访问类内的普通成员变量
2、具有全局性质,独立类的对象存在,调用时可直接使用类名::函数名进行调用,也可由对象调用(不推荐)
3、只能调用静态成员函数或静态成员变量

下面是一个简单的例子:

#include<iostream>using namespace std;class CTest{public:    CTest();    ~CTest();    void Display() const;    static void Test();private:    int m_nTest;    const int m_Const;      static int num; } ;int CTest::num = 100;                    //static成员变量必须在类外进行定义性声明 CTest::CTest():m_Const(10),m_nTest(20){} CTest::~CTest(){}void CTest::Display() const{    //m_nTest = 100; 错误,只读成员函数不能对类内部的成员变量进行修改     cout << m_nTest << endl;} void CTest::Test(){//staitc成员函数无this指针,具有全局性质//  cout << "StaticFun:" << m_nTest << endl; 错误,静态成员函数不能访问普通成员变量    cout << num << endl;                // 访问static成员变量 }int main(){    CTest t;    t.Display();     //CTest::Display();            错误,普通成员函数必须由对象调用    CTest::Test();                    //独立于某个对象     return 0;}
0 0