C/C++ static用法

这篇文章没有太多的实际内容,简单记录下static的用法。顺便试一下用markdown来写文章。

1. 在函数中使用

我们都知道在一个函数中的变量是存储在栈区中,函数的每一次调用都伴随着变量的重新定义和销毁。如果在变量前面加上static关键字,这个变量就会在程序的静态存储区。这个变量只会在第一次调用函数的时候定义并初始化。当再次调用函数时,会保留上次的值。例子:

int showNum()
{
    static int num = 0;
    return num++;
}
int main()
{
    for(int i=0;i<10;i++)
    {
        cout << showNum() << endl;
    }
    return 0;
}//打印0到9

2. 在类中使用

这里面规则有点多,我直接上代码,然后比较好说明:

class X{
    int i;
    static int j;
public:
    X(int ii = 6) : i(ii){
        //非静态成员函数可以访问静态成员函数和变量
        j = i;
    }
    int val(){return j;}
    static int incr(){
        return ++j;
    }
    static int f()
    {
        return incr();
    }
};
int X::j = 0;
int main()
{
    X x;
    X* xp = &x;
    cout << x.f() << endl;
    cout << xp->f() << endl;
    cout << X::f() << endl;
    cout << sizeof(X) << endl;
    return 0;
}

有下面几个要点:

  1. 静态成员变量属于类,不属于任何一个对象,必须在类外初始化。(int X::j = 0)
  2. 静态成员函数只能访问静态成员,非静态成员函数可以访问静态成员。
  3. 可以用类名::这样的形式访问静态成员变量和静态成员函数。

上面sizeof(X)的结果是4,说明静态成员变量j是放在静态存储区域。每个对象的成员变量都是独立的,而静态成员是所有对象共享,它没有this指针,所以静态成员函数只能访问静态成员变量。

3. translation unit 隐藏

这个translation unit我也不知道该怎么翻译,就理解为一个源文件吧。static还有一个作用就是,声明为static的变量和函数只在该文件(translation unit)有效,在其他文件中不能访问。这在大型工程中,能有效避免命名重复。

markdown写东西果然爽,不过以前中文格式看习惯了,谁能告诉我,首行缩进两个字这个需求该怎么办到。

posted @ 2014-01-26 20:13  细胞核  阅读(1981)  评论(1编辑  收藏  举报