C++ 关键字static详解

来源:互联网 发布:au软件单轨功能 编辑:程序博客网 时间:2024/05/08 14:20

static在C/C++中可以修饰变量和函数,static变量存储在静态存储区中,对于static函数来说,一般的static全局函数和类中的static成员函数有着不同的意义,下面详细介绍static的作用。

对于修饰全局变量和局部变量(不包括类的成员变量),static的主要作用是存储在隐藏变量、静态存储区和初始化为0,对于修饰函数(不包括类的成员函数),作用就是隐藏。

一、修饰全局变量
static int x = 1;
void main()
{
    printf(“%d/n”, x);
}
static全局变量存储在静态存储区,但是对于一般的全局变量来说,也是存储在静态存储区的,这两者这之间有何区别呢?这就要说道static的第一个作用:隐藏变量。请看下面的例子:

A.cpp中
static int a = 1;
int b = 1;

B.cpp中
extern int a;
extern int b;

void method()
{
    a = 100;  //错误
    b = 100;  //OK
}
这里有两个cpp,A.cpp中定义static全局变量a和非static全局变量b,定义为static的全局变量只在A.cpp中可见,在其他文件中不能通过extern声明找到它,所以可以说static隐藏了全局变量a。
另外,如果不给static变量赋初值的话,static会默认为0,这是static修饰变量的另一个作用。

总结:static修饰全局变量,可以将static全局变量隐藏在只在当前文件中可见。如果不初始化的话,默认为0。

二、修饰局部变量
void method()
{
    static int x = 1;  //这句话根本就没有被执行
    printf(“%d/n”, x++)
}
void main()
{
    method();
    method();
}
输出结果:
1
2
static修饰局部变量x,是其保存在静态存储区,这是static的第二个作用,x在运行期被初始化一次之后,就不会再被初始化了,和一般局部变量相比,x可以在method函数中持久保存。
static的隐藏作用也被应用,被static修饰的局部变量实际上已经被隐藏,虽然存储在静态存储区,但只在定义它的函数中可见。当然,如果不初始化的话,static局部变量也会被初始化为0

总结:static修饰局部变量可以把局部变量存储在静态存储区,并且只在定义它的函数中可见。可以说static修饰的变量(全局变量或局部变量)都存储在静态存储区,并且static可控制static变量的可见范围。

三、修饰函数
static void method()
{
}
这里所说的函数是一般的函数,非类的成员函数,修饰函数的static的作用就是隐藏。同修饰全局变量一样,static函数可见范围只是当前cpp中,不能使用extern在其他cpp中使用。

总结:static修饰一般的函数,非类的成员函数只起到隐藏的作用。

在类中,static可以修饰成员变量和成员函数

四、修饰成员变量
class MyClass
{
    static int x;  //这里只是声明
}

int MyClass::x = 1;  //定义并初始化
静态成员变量存储在静态存储区,这个静态成员变量在内部是可见的,对于外部或者派生类来说是否可见取决于类的定义,public、protected或者private。
这里要注意一下,在类中的静态成员变量只是变量的声明,一定要在类的外部定义,定义时不用加static,并且最好不要放在.h文件中,否则很有可能引起错误。定义时也可不初始化,默认为0。

另外static成员变量可以作为成员函数的默认参数,并且在const成员函数中也可以修改static成员变量
class MyClass
{
public:
    static int x;
    int m;
    void method(int param = x); // OK
    void method(int param = m); // 错误
    void method() const
    {
        x = 100;  //OK
        m = 100;  //错误
    }  
}

总结:在类里声明static成员变量,并且要在类外面定义(初始化),注意最好不要再.h中定义,应该放在cpp中。

四、修饰成员函数
static成员函数可以被独立调用,无需创建任何对象,但是static成员函数不能使用任何非static成员变量或成员函数,因为static成员函数中没有this指针
class MyClass
{
public:
    static int x;
    int m;
    static void method()
    {
        x = 100;  //OK
        m = 100;  //错误
    } 
}

void main()
{
    MyClass::method();
}
被static修饰的成员函数不能被声明为const和virtual等
class MyClass
{
    static void method() const;   //错误
    virtual static void method(); //错误
}

 

FROM:http://blog.csdn.net/macomfan/article/details/5887936

原创粉丝点击