C++编程思想学习笔记——名字控制

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"><span style="font-size:18px;"></span></span><pre name="code" class="cpp"><span style="background-color: rgb(255, 255, 255); font-family: Arial, Helvetica, sans-serif;">概要:名字控制主要用于对名字的产生和名字的可见性进行控制,包括这些名字的存储位置以及名字的连接。</span>
 
 

  1. 在C/C++中,Static都有两种基本的含义
    1. 在固定的地址上进行存储分配,也就是说对象是在一个特殊的静态数据区上创建的,而不是每次函数调用时在堆栈上产生的。
    2. 对一个特定的编译单位来说是局部的。这样,Static控制名字的可见性,所以这个名字在这个单元之外是不可见的,同时也决定连接器将看到哪些名字。
    3. Static变量或对象只在函数第一次调用时初始化一次,以后它将在两次函数调用之间保持它的值。
    4. 如果没有为一个内建类型的静态变量提供一个初始值时,编译器也会确保在程序开始时它被初始化为零,零赋值只对内建类型有效,用户自定义类型必须用构造函数来初始化。
    5. 在使用带有静态变量的函数时,应该考虑多线程的问题。
  2. 静态对象的析构函数
    1. 静态对象的析构函数在程序从main()中退出时,或者标准的C库函数exit()被调用时才被调用。注:在析构函数内部使用exit()是很危险的,这样导致了无穷的递归调用。
    2. 用标准的C库函数abort()退出程序时,静态对象的析构函数并不会被调用。
    3. 同普通对象的销毁一样,静态对象的销毁也是按与初始化时相反的顺序进行的。
    4. 全局对象总是在main()执行之前被创建,在退出main()时销毁。
    5. 如果一个包含局部静态对象的函数从未被调用过,那么这个对象的构造函数也就不会执行,自然也不会执行析构函数。只要包含局部静态对象的函数在名义上被调用了,那么它的构造函数就会被执行。
  3. 控制连接
    1. 一般情况下,在文件作用域内所有名字对程序中的所有翻译单元来说都是可见的,这就是所谓的外连接(external linkage)。因为在连接时这个名字对连接器来说是可见的,对单独的翻译单元来说它是外部的。全部变量和普通函数都有外部链接。
    2. 在文件作用域内,一个被明确声明为static的对象或函数的名字对翻译单元来说是局部于该单元的,这些名字是内连接的。内连接的一个好处是这个名字可以放在一个头文件中而不用担心连接时发生冲突。
  4. 名字空间的作用就是将一个大的全局名字空间分割成多个可管理的小空间。空间名字彼此不能相同,但是控制之间内部变量则可以相同。形象地说,就像行政区命名一样,几乎没有相同名字的省市,但是在不同的省市之间,可能有相同名字的村庄。
  5. 创建名字空间
    <span style="font-size:18px;font-weight: normal;">namespace xxx{
    
    };</span>
  6. namespace的特征:
    1. namespace只能在全局范围内定义,但是它们之间可以互相嵌套;
    2. 在namespace定义的结尾,右花括号的后面不必跟一个分号;
    3. 可按照类的语法定义一个namespace,定义的内容可在多个头文件中延续,就好像重复定义这个namespace一样。
    4. 一个namespace的名字可以用另一个名字来作它的别名,这样就可以不必敲打那些开发商提供的冗长的名字了。
      <span style="font-weight: normal;">namespace xxx{
         ...
      }
      
      namespace mylib = xxx;</span>
    5. 不能像类那样去创建一个名字空间的实例。
  7. 使用名字空间的方法:
    1. 作用域解析
      namespace xxx{
         int i;
         ...
      }
      
      xxx::i = 1;

    2. 使用指令
      using namespace xxx;

猜你喜欢

转载自blog.csdn.net/zdx19880830/article/details/40615079