C/C++中STATIC用法总结

static的做用主要有两种:

限定做用域
保持变量内容持久化html

c语言中static的用法

全局静态变量 :

用法:在全局变量前加上关键字static,全局变量就定义成一个全局静态变量。c++

static int temp;

内存中的位置:静态存储区,在整个程序运行期间一直存在。
初始化:未经初始化的全局静态变量会被自动初始化为0(自动对象的值是任意的,除非他被显式初始化)。
做用域:全局静态变量在声明他的文件以外是不可见的,准确地说是从定义之处开始,到文件结尾。函数

局部静态变量:

用法:在局部变量以前加上关键字static,局部变量就成为一个局部静态变量。.net

func(void) {
    static int temp;
}

内存中的位置:静态存储区
初始化:未经初始化的全局静态变量会被自动初始化为0(自动对象的值是任意的,除非他被显式初始化)。
做用域:做用域仍为局部做用域,当定义它的函数或者语句块结束的时候,做用域结束。可是当局部静态变量离开做用域后,并无销毁,而是仍然驻留在内存当中,只不过咱们不能再对它进行访问,直到该函数再次被调用,而且值不变。code

静态函数:

用法:在函数返回类型前加关键字static,函数就定义成静态函数(函数的定义和生命在默认状况下都是extern的,但静态函数只是在声明他的文件当中可见,不能被其余文件所用)。htm

satic void func() {
}

做用域:只在声明该函数的文件中可见。对象

c++中static的用法

类的静态成员:

用法:类声明中在成员变量前加static,该成员就成为类的静态成员。blog

class A{
  private:
    static int val;

};

内存中的位置:静态存储区。
初始化:不能在类定义体中(class中)和定义类的头文件中初始化,能够在类方法的实现文件(cpp文件)中初始化,且初始化时不用加static关键字(缘由:若是在类体或者头文件中初始化static成员,容易致使头文件屡次包含时,成员被屡次建立/初始化,违背c++中one definition rule!)。
做用域:全部能够访问该类的位置。能够经过类名直接访问public 静态成员;能够经过对象名访问public静态成员;静态成员函数能够直接访问静态成员变量。继承

注意:static const 型静态成员能够在类定义体中(class中)初始化。内存

类的静态成员函数:

用法:类声明中在成员函数前加static,该成员函数就成为类的静态成员函数。

class A{
  private:
    static int func(int x);

};

若是在cpp文件中实现,实现的时候也不须要static的修饰,由于static是声明性关键字;类的静态函数是该类的范畴内的全局函数,不能访问类的私有成员,只能访问类的静态成员,不须要类的实例便可调用;实际上,他就是增长了类的访问权限的全局函数。

void  A::func(int);

静态成员函数能够继承和覆盖,但没法是虚函数;

只在cpp内有效的全局变量:

在cpp文件的全局范围内声明: static int val = 0; 这个变量的含义是该cpp内有效,可是其余的cpp文件不能访问这个变量;若是有两个cpp文件声明了同名的全局静态变量,那么他们其实是独立的两个变量.

只在cpp内有效的全局函数:

函数的实现使用static修饰,那么这个函数只可在本cpp内使用,不会同其余cpp中的同名函数引发冲突;

warning:不要再头文件中声明static的全局函数,不要在cpp内声明非static的全局函数,若是你要在多个cpp中复用该函数,就把它的声明提到头文件里去,不然cpp内部声明需加上static修饰.

参考:

http://www.javashuo.com/article/p-opugyjzl-ge.html
https://www.cnblogs.com/lvxiaoning/p/7598062.html
http://blog.csdn.net/liujianfei526/article/details/50562881
http://www.runoob.com/cplusplus/cpp-static-members.html
http://bbs.csdn.net/topics/390649283

相关文章
相关标签/搜索