第九章 内存模型和名称空间
1.程序一般分为3部分:
头文件:包含结构声明和使用这些结构的函数的原型
源代码文件:包含与结构有关的函数的代码
源代码文件:包含调用与结构相关的函数的代码
2,头文件常包含内容:
函数原型
使用#define或const定义的符号和常量
结构声明
类声明
模板声明
内联函数
3.防止多次包含同一个头文件
预处理器编译指令
#ifndef XXXX_H_
#define XXXX_H_
...
#endif
4.C++使用3中方案存储数据
自动存储持续性 在所属函数内创建,跟随函数执行完毕被释放
静态存储持续性 在函数外定义的变量和使用static修饰的变量
动态存储持续性,自由存储,堆 使用new申请
5.作用域(scope)描述了名称在翻译单元的多大范围内可见
链接性(linkage)描述了名称如何在不同单元间共享
6.函数原型作用域中使用的名只在参数列表的括号内可见
所以原型的变量标识可有可无
7.对自动变量进行管理,方法是流出一段内存,称为栈
栈是后进先出LIFO,使用栈底和栈顶指针,就可以管理自动变量了
8.如果没有初始化静态变量,将会对静态数组和结构的每一个成员设置为0
9.
存储描述 持续性 作用域 链接性 如何声明
自动 自动 代码块 无 在代码块
寄存器 自动 代码块 无 代码块,用register
静态,无链接性 静态 代码块 无 代码块,使用static
静态,外部链接 静态 文件 外部 不在任何函数内
静态,内部链接 静态 文件 内部 不在任何函数内,使用关键字static
10.对于静态变量,会先执行零初始化,然后再计算初始化表达式
11.单定义规则,变狼只能有一次定义。当然,是指在同一个作用域内。另外,局部变量会覆盖同名全局变量
12.作用域解析运算符::,对变量使用,就是叫编译器使用该变量的全局版本
13.mutable修饰变量,指出即使结构或类的对象是const,修饰的成员变量也可以被修改
14.在全局中声明的const变量,他的链接性是内部的,相当于使用了static
15.C++编译器会对函数名称做名称修饰,而C不会、为使用C库的函数
extern "c"{}
extern "c++" {}
16.new定位运算符P321
17.名称空间
声明区域:可以在其中声明的区域
潜在作用域,从声明点到声明区域结束
名称空间可以是全局的,可以在另一个名称空间内,不能再代码块内
名称空间是开放的,可以多次将不同成员加入名称空间内
namespace Name{}
using声明 如using std::cout
using编译指令 如using namespace std
对名称空间可以嵌套
未命名的名称空间他的链接性是内部的
一个名称空间包含另一个名称空间,则声明大的名称空间相当于声明了两个名称空间
18.名称空间及其前途
指导原则
使用已命名的名称空间中声明的变量,而不是外部全局变量
使用已命名的名称空间中声明的变量,而不是静态全局变量
开发了一个函数库或类库,应当放在一个名称空间内
仅当使用using编译指令作为旧代码使用名称空间的权宜之计
不要在头文件中使用using编译指令。如确定要使用,应当放在#include 之后
导入名称,优先使用作用域运算符或using声明的方法
对于using声明,优先将作用域设置为局部而不是全局
9.6编程练习 有时间就做