一、前言
创建名字是程序设计过程中的一项最基本的活动,当项目很大时,它会不可避免的包含大量的名字。c++允许我们对名字的产生和名字的可见性进行控制,包括名字·的存储位置和名字的连接。
本章主要介绍,static控制存储和可见性,以及通过名字空间来控制访问名字的改进方法。
二、static控制名字的存储和可见性
static的两个基本含义:
1.对象会在静态数据区上创建,而不是每次函数调用时在堆栈上产生。(静态数据区:静态变量和全局变量存放在同一个存储区域,在程序结束后由系统释放。)
2.static控制名字的可见性,在这个名字的单元或类之外时不可见的。
2.1函数内部的静态变量
在函数内部定义局部变量时,每次调用函数时,都会使堆栈的指针向下移动一个适当的位置为这些局部变量分配内存。
如果需要在函数两次调用的时候保留变量的值,又要保证这个变量只受这个函数控制,就可以在函数内部定义static对象。(如果使用全局变量,对于其它的函数,这个变量是可见的)这个变量会存储在静态数据区,而不是在堆栈中。只在第一次调用时初始化。
2.2控制连接
外部连接:在文件作用域内的所有名字(即不嵌套在类和函数内部的名字)对程序中所有的翻译单元都是可见的。全局变量和普通函数都是外部链接。
内部连接:仅在文件内部是可见的,文件之外的函数不能看到或访问,这个变量也不会和外部的标识符产生冲突(被声明为static的对象或函数名字对翻译单元是局限于该单元的)
2.3其它存储说明符
auto:指编译器自动为该变量分配存储空间的方法(告诉编译器这是一个局部变量)
register:也是一个局部变量,告诉编译器这个变量会经常用到,所以尽可能的放在寄存器中
三、名字空间
C++通过名字空间namespace,把全局名字空间分成多个可管理的小空间
1.namespace只能在全局范围内定义,但它们之间可以相互嵌套,
2.可以按类语法定义namespace,定义的内容可以在多个文件中延续,就好像重复定义这个namespace
3.一个namespace可以用另一个名字作为它的别名
4.不能像类一样去创建名字空间的实例
5.每个翻译单元可以包含一个没有命名的名字空间,自动变成内部连接
四、类中的静态成员
类的静态成员拥有一块单独的存储区,而不管创建了多少个该类的对象。所有对象的静态数据成员共享这一块静态存储区。
1.静态数据成员的定义
如果一个静态数据成员被声明,但没有定义时,连接器会报错。定义必须出现在类的外部,而且只能定义一次(不允许内联)。静态常量可以在类内提供定义
2.静态成员函数
静态成员函数可以不需要任何对象自我调用,不能访问一般数据成员,只能访问静态数据成员,也只能调用其它静态数据成员
没有传递this指针,所以不能访问非静态的数据成员,也不能调用非静态的成员函数
五、C++中使用C的库
如果要使用C的函数如下
float f(int a,char b)
C++编译器会将名字变成_f_int_char之类的,以支持函数重载,但在c中它的内部名就是_f,这样连接器将无法解释f。
可以使用连接替代说明,
extern "C" float f(int a,char b)