C/C++中的static

| | 评论(1)

这个关键词几乎是所有面C/C++相关的技术时会被问到的。总结一下:

首先在C里面

/*  ----- test.c --- */

static int status;

static int sort( int * p, int length)
{
}

int change_status()
{
    static int s = 0;
}

int status 是一个local global variable, 意思是在文件test.c里面它是全局的,但是在其它文件里不可见。问题来了,如果其它源文件也定义一个static int status呢?完全没有关系在这里,因为互相不可见。一个常见问题,static变量存在哪里?答案是data segment. 再也是一个常见问题,啥时候初始化? compiling. 

这个local global特性也可以作用在函数上,例如上面的sort(),就是一个当前源文件可见的函数,其他源文件大可以自行定义自己的sort(),当然,也要用static,否则就是全局可见。注意static作用的是函数而非返回值。

// test.cpp

class A
{
    static int status;
    static int get_status();
}
int A::status = 0; //初始化必须在类定义外进行,这个有点weird,但标准就是这样定的

在C++里面,类里面的static变量是global而非local global了。成员函数被冠以static时的特殊之处在于函数里面只能访问当前类的static变量。道理很简单,static函数可以没有instance被使用,例如A::get_status(),如果让它访问动态成员只能得到非法指针。

关于初始化,如果不写那一句初始化(或者说我们不想初始化)如何?编译会通过,但是link会有问题。

--最后一个killer问题,最好在问过structure和class有什么区别之后问,structure里可以有static变量么?相信绝大多数用了不少年C/C++的人也没有想过这个。当你面试别人而且不厚道的话可以问这个。

分类

评论(1)

viva :

seems so complex for the new soul to understand these programming lauguages:) BTW,got ur blog link from douban.
Ur comments are fabulous:)

发表评论


关于此日记

此日记由mach发表于April 25, 2010 4:31 PM

此Blog上的上一篇日记Intel Museum

此Blog上的下一篇日记手机拼图

主索引归档页可以看到最新的日记和所有日记。

Powered by Movable Type 4.23-en