5
11
2014
0

C/C++中函数、变量为何使用static

在C语言中,即非面向对象,与如下三点好处

1.用static修饰某个函数、变量,可以不用担心和别文件中的函数、变量重名问题。因为未加static则默认全局可见,这一功能就可以称为隐藏功能(函数唯一好处;非函数还可见2、3点)。

2.在运行过程中保持值不变。存储在静态数据区的变量只会在函数开始时初始化一次。有两种变量存储在静态数据区,一种是全局变量,另一种就是static。两者区别,全局变量全局可见、static隐藏了可见性,即该文件可见。看如下代码

#include <stdio.h>

int fun(void){
    static int count = 10;    // 函数初始化时赋值
    return count--;
}

int count = 1;

int main(void)
{    
    printf("global\t\tlocal static\n");
    for(; count <= 10; ++count)
        printf("%d\t\t%d\n", count, fun());    
    
    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.自动初始化。数值类型自动初始化为0,static char *a[]初始化为一个串尾符。

#include <stdio.h>

int a;

int main(void)
{
    int i;
    static char str[10];

    printf("integer: %d;  string: (begin)%s(end)", a, str);

    return 0;
}

结果为integer: 0; string: (begin)(end)

 

若为面向对象,则:

1.在类中的static成员变量意味着被类的所有实例共享,即某个实例修改了改对象,则该修改对其他所有实例可见。

2.类中的static成员函数无this指针,故只能访问static成员变量。且还可以退出通过类名就可以访问成员和函数

3.指向static成员指针和指向static函数指针都是普通指针,即存放的是绝对地址。这一点同全局变量和全局函数,因为其特点差不多,但是类中的普通函数指针和普通成员指针是相对地址,即相对于这个类起始地址的偏移值,如下原因:1类的成员函数需要通过一个对象来调用

4.由于长期占有存储空间,故局部类不能定义静态数据成员,因为局部类的生存期和局部静态成员的生存期矛盾

5.union数据成员共享空间,而静态数据成员占有各自独立的存储单元。故union{static int a;static int b}错误

6.注意static修饰类的成员函数时不能与friend同时使用,因为friend是友元,而非自己的成员函数

参考:

http://blog.163.com/sunshine_linting/blog/static/4489332320119785228616/

http://zhidao.baidu.com/link?url=8D2YngLhHg2k9Ma10tJgKK4KykkJWcrjuJWx-v2xjcZvVTFn9oNr08xcJOY8_P2WoQH3sB4gBxemHJboLVw0qK

Category: 编程理解 | Tags: static

Host by is-Programmer.com | Power by Chito 1.3.3 beta | Theme: Aeros 2.0 by TheBuckmaker.com