C++编程思想读书笔记--之static

来源:互联网 发布:淘宝联盟注册淘宝客 编辑:程序博客网 时间:2024/05/16 10:49
 

Static关键字

  • 静态存储,在固定的地址上分配,
    也就是说对象是在一个特殊的静态数据区上创建的,
    而不是每次在函数调用时的堆栈上产生的。
    • 函数体内部的静态对象
      如果对象是一个类,程序控制第一次转到对象的定义时,而且只有第一次时,才需要执行构造函数。

      静态对象的析构函数
      静态对象的析构函数在程序从main()块中退出时,或者标准的C库函数exit()被调用时才被调用。

      如果一个包含静态对象的函数从未被调用过,
      那么这个对象的构造函数也不会执行,析构函数也不会执行。

      C++中,全局静态对象的构造函数是在main()之前调用的,
      所以我们现在有了一个在进入main()之前执行一段代码的简单的、可移植的方法,
      并且可以在退出main()之后用析构函数执行代码。

      要在C中做到这一点,我们不得不熟悉编译器开发商的汇编语言的开始代码。

  • 对一个特定的编译单位来说是本地的。
    这里static控制名字的可见性,
    所以这个名字在这个单元或类之外是不可见的。
    • 一般情况下,在文件范围内的所有名字(既不嵌套在类或者函数中的名字)对程序中的所有编译单元来说都是可见的,这就时所谓的外部连接。
      在文件范围内,一个被明确声明为static的对象或函数的名字对编译单元(一般是指出现声明的.cpp文件)来说时局部变量,这就是所谓的内部连接。
      内部连接的好处就是这个名字放在一个头文件中,不用担心连接时发生冲突。
      那些通常放在头文件里的名字,象常量、内联函数,缺省情况下(C++是内部连接,C是外部连接)

  • 冲突问题:
    static两个含义怎样交叉。
    • 所有的全局对象都是隐含为静态存储类。
      int a=0;
      main(){/*...*/}
      则a被存储在程序的静态数据区,在进入main()函数前,a即被初始化。
      另外,a对全局都是可见的,包括所有的编译单元。

      用可见性术语,static(只在编译单元内可见)的反义是extern,他表示这个名字对所有的编译单元是可见的。
      int a = 0;
      extern int a =0;
      上面这两个效果是一样的。

      static int a= 0;
      这么定义仅仅改变了a的可见性,现在a成了一个内部连接。但存储类型没有改变。

原创粉丝点击