C++中static的全部用法


  static的所有用法

  要 了解static,就必须要先 了解另一个与之 绝对的 要害字,众多人可能都还不晓得有这个 要害字,那便是auto,其实我们通常申明的不用static 润饰的变量,都是auto的,由于它是默许的,就象short和long总是默许为int一样;我们通常申明一个变量:

  int a;

  string s;

  其实便是:

  auto int a;

  auto string s;

  而static变量的申明是:

  static int a;

  static string s;

  这样 仿佛 可以更有利于 了解auto和static是一对成对的 要害字吧,就像private,protected,public一样;

  关于static的不 了解,其实便是关于auto的不 了解,由于它是更普通的;有的东西你每天在用,但未必就代表你真正了解它;auto的 含意是由程序自动操纵变量的生存周期,通常指的便是变量在进入其作用域的时候被 调配,离开其作用域的时候被 开释;而static便是不auto,变量在程序初始化时被 调配,直到程序退出前才被 开释;也便是static是依照程序的生命周期来 调配 开释变量的,而不是变量自己的生命周期;所以,像这样的例子:

  void func()

  {

  int a;

  static int b;

  }

  每一次调用该函数,变量a都是新的,由于它是在进入函数体的时候被 调配,退出函数体的时候被 开释,所以多个线程调用该函数,都会 占有各自独立的变量a,由于它总是要被再一次 调配的;而变量b 无论你是不是 使用该函数,在程序初始化时就被 调配的了,或者在第一次执行到它的申明的时候 调配(不同的编译器可能不同),所以多个线程调用该函数的时候,总是 拜访同一个变量b,这也是在多线程编程中必须 留神的!

  static的所有用法:

  1.类的静态成员:

  class A

  {

  private:

  static int s_value;

  };

  在cpp中必须对它进行初始化:

  int A::s_value = 0;// 留神,这里没有static的 润饰!

  

  类的静态成员是该类所有实例的共用成员,也便是在该类的 规模内是个全局变量,也 可以 了解为是一个名为A::s_value的全局变量,只是它是带有类安全属性的; 情理很 方便,由于它是在程序初始化的时候 调配的,所以只 调配一次,所以便是共用的;

  类的静态成员必须初始化, 情理也是一样的,由于它是在程序初始化的时候 调配的,所以必须有初始化,类中只是申明,在cpp中才是初始化,你 可以在初始化的代码上放个断点,在程序执行main的第一条语句之前就会先走到那;假如你的静态成员是个类,那么就会调用到它的 构造函数;

  2.类的静态函数:

  class A

  {

  private:

  static void func(int value);

  };

  实现的时候也不需求static的 润饰,由于static是申明性 要害字;

  类的静态函数是在该类的 规模内的全局函数,不能 拜访类的私有成员,不得不 拜访类的静态成员,不需求类的实例即可调用;实际上,它便是添加了类的 拜访权限的全局函数:void A::func(int);

  静态成员函数 可以继承和 遮蔽,但 无奈是虚函数;

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

  在cpp文件的全局 规模内申明:

  static int g_value = 0;

  这个变量的 含意是在该cpp内有效,然而 其余的cpp文件不能 拜访这个变量;假如有两个cpp文件申明了同名的全局静态变量,那么他们实际上是独立的两个变量;

  假如不 使用static申明全局变量:

  int g_value = 0;

  那么将 无奈 保障这个变量不被别的cpp共享,也 无奈 保障 定然能被别的cpp共享,由于要让多个cpp共享一个全局变量,应将它申明为extern(外部)的;也有可能编译会报告变量被 反复定义;总之不 提议这样的写法,不明确这个全局变量的用法;

  假如在一个头文件中申明:

  static int g_vaule = 0;

  那么会为每个包括该头文件的cpp都 缔造一个全局变量,但他们都是独立的;所以也不 提议这样的写法,一样不明确需求 怎么 使用这个变量,由于只是 缔造了一组同名而不同作用域的变量;

  这里顺便说一下如何申明所有cpp可共享的全局变量,在头文件里申明为extern的:

  extern int g_value; // 留神,不要初始化值!

   而后在其中任何一个包括该头文件的cpp中初始化(一次)就好:

  int g_value = 0; // 初始化一样不要extern 润饰,由于extern也是申明性 要害字;

   而后所有包括该头文件的cpp文件都 可以用g_value这个名字 拜访 雷同的一个变量;

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

  在cpp内申明:

  static void func();

  函数的实现不需求static 润饰,那么这个函数只可在本cpp内 使用,不会同 其余cpp中的同名函数引起 摩擦; 情理和假如不 使用static会引起的问题和第3点一样;不要在头文件中申明static的全局函数,不要在cpp内申明非static的全局函数,假如你要在多个cpp中复用该函数,就把它的申明提到头文件里去,不然在cpp内部申明需求外加static 润饰;在C语言中这点由为主要!