c++中static关键字浅析

    静态变量作用范围在一个文件内,如果其他文件需要访问,要事先extern。程序开始时分配空间,结束时释放空间,默认初始化为0,使用时可以改变其值。静态变量存放在静态变量区。

     在C中引入关键字static是为了表示退出一个块后仍然存在的局部变量。随后,static在C中有了第二种含义:用来表示不能被其它文件访问的全局变量和函数。为了避免引入新的关键字,所以仍使用static关键字来表示这第二种含义。最后,C++重用了这个关键字,并赋予它与前面不同的第三种含义:表示属于一个类而不是属于此类的任何特定对象的变量和函数。

    当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。我们要同时编译两个源文件,一个是a.c,另一个是main.c

//a.c内容
char a = 'A';
void msg() { printf("Hello\n"); }
//下面是main.c的内容:
int main(void) {
    extern char a;//能够被其他模块以extern修饰符引用到的变量通常是全局变量
    printf("%c\n", a);
    (void)msg();
    return 0;
}

执行 gcc main.c a.c -o main

运行main

程序的运行结果是:

A

Hello

注:如果使用g++ main.c a.c -o main的话,msg函数也需要extern

    static变量在程序开始时就已经有了空间,而不像局部变量,到达了定义时才会分配空间。下面是一个例子。例子中static只在函数中可以访问,隐藏了变量的同时也使得fun函数有了一个“全局变量”。

#include <stdio.h>
int fun() {
    static int count = 10;//执行fun时不会执行这句声明
    return count--;
}
int main() {
    printf("%d\n", fun());
    printf("%d\n", fun());
    return 0;
}

程序输出为:

10


若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度;
若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度;

c++类中的static

静态成员的值对所有的对象是一样的。静态成员可以被初始化,但只能在类体外进行初始化。

静态成员仍然遵循public,private,protected访问准则。

静态成员函数只能访问静态成员函数,不能访问非静态成员函数。

留言:
gaolee 说:
2015/6/4 1:51:51

悦神总结太到位了,长知识

龙门外的鱼 回复: gaolee
2015/6/6 12:24:25

给人生赢家高老板跪了