C++Primer Plus(第六版)第九章学习笔记

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 存储方案和动态分配

  1. 使用new运算符初始化
    int *pi = new int(6)//set *pi to 6
    在初始化结构或数组是类型后面要用大括号{}
  2. new失败时
    引发异常 std::bad_alloc
  3. 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++名称空间

  1. 声明区域(declaration region):声明所在的区域
  2. 潜在作用域(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编译指令

猜你喜欢

转载自blog.csdn.net/baidu_29452653/article/details/88422008
今日推荐