9.1 单独编译
把独立的函数组件放在单独的文件中,单独编译过后将他们链接成为可运行的程序
单独编译带来的问题:
在多个文件中都使用到同一结构声明时,结构进行修改要将每一个文件中的结构声明进行对应修改
解决方案:
将所有被共同使用的结构等声明放入头文件,所有文件包含该头文件,修改时只用修改头文件即可
头文件中包含的内容
- 函数原型(声明)
- 使用#define 和const 声明的符号常量
- 结构声明
- 类声明
- 模板声明
- 内联函数
所以头文件中声明的函数,都是在源代码文件中定义的
9.2 存储的持续性,作用域和链接性
数据保存方案
- 自动存储持续性
- 静态存储持续性
- 线程存储持续性
- 动态存储持续性
9.2.1 作用域和链接
作用域(scope):表示名称在文件的多大范围可见
链接性(linkage):在不同单元间共享
9.2.2 自动存储持续性
默认状况,函数中声明的函数参数或者变量的存储持续性都是自动的,作用域为局部,即只在函数内有用。
但当函数内部定义的参数名与外部定义的参数同名时,暂时隐藏外部参数名,在函数内部以内部定义为准。
9.2.3 静态持续变量
- 外部链接性:在代码块外声明
- 内部链接性:在代码块外声明且用static
- 无连接性:代码块内声明且用static
静态持续变量在整个程序中存在,甚至无连接性,虽然代码块外无法使用,但始终存在
静态变量初始化:常量表达式初始化和动态初始化
当初始化右值无法用简单计算求出时就是动态初始化
9.2.4 静态持续性,外部链接性
1.单定义规则:不能有多个变量名称相同
引用声明关键字:extern
表示该变量在其他地方定义,此处不定义。除非进行赋值
在多个文件都要使用同一外部变量时,在一个文件中对变量定义,使用时使用extern声明即可。
9.2.5 静态持续性,内部链接性
就是只能在同一文件中使用而已
9.2.6 静态存储持续性,无连接性
就是只能在函数里用,专供该函数使用,多次调用之间其值不改变
9.2.7 说明符和限定符
说明符基本说过
限定符(-cv)
- const
- volatile
**2.mutable:**即使被const声明,改值也可能被修改
3.const
const的定义是内部链接的,默认的全局变量是外部的,所以用const定义的全局变量就相当于用了static一样
所以就可以吧const常量放在头文件中,因为其只在头文件中链接,所以在其他文件中使用其声明是没有问题的,作用域不包含其他文件
当你需要一组外部链接的const常量时,可在定义前加上extern,来覆盖其内部链接型,从而成为一个外部链接的const常量
9.2.8 函数的链接性
函数默认为外部的,也可以使用static来声明从而达到内部链接函数
9.2.10 存储方案和动态分配
- 使用new运算符初始化
int *pi = new int(6)//set *pi to 6
在初始化结构或数组是类型后面要用大括号{} - new失败时
引发异常 std::bad_alloc - new: 运算符,函数和替换函数
运算符new和new[]分别调用如下函数:
void * operater new(std::size_t);
void * operater new[](std::size_t);
这些函数称为分配函数
4. 定位new运算符
可以将申请的内存指定位置,要包含头文件new
pd2 = new (buffer) double[N]//将申请的内存放在buffer里面
9.3 名称空间
名称可以是变量,函数,结构,枚举,类以及类和结构成员。为了避免名称冲突,所以使用名称空间来存储不同的原型
9.3.1 传统的C++名称空间
- 声明区域(declaration region):声明所在的区域
- 潜在作用域(potential scope):声明开始到声明区域结束为止
9.3.2 新的名称空间特性
利用namespace来创建声明区域,用using关键字来使用
namespace Jace{
double pail;
void fetch();
int pal;
struct Well{...};
} //building the namespace
除了用户定义名称空间外。存在全局名称空间(global namespace),所以全局变量游客说为位于全局名称空间中
using声明和using编译指令:声明只是在当前的作用域中可用,就相当于是把那个对应的变量放到此条语句处替换,而using编译指令是全局可用所有命名空间中的变量。
4. 未命名名称空间//别问我为什么是4,前三个没意思不用写
就是声明的时候,空着namespace后面的地方,相当于默认使用了using编译指令对该名称空间,但是该名称空间的内容不能在其他文件中使用,所以相当于static。作用域都是在本文件内
9.4 总结
- 独立编译,将函数原型同一放在头文件中,定义在源代码中
- 存储方案决定变量的有效时间,即留在内存空间中的时间:分为自动变量,静态持续,动态持续
- 链接性来说,在函数外定义的为外部链接,函数外且static为内部链接,函数内且static为无连接
- 外部链接关键词extern
- new和delete
- namespace和using声明以及using编译指令