一、
1.头文件中内容:函数原型、#define与const常量、结构声明、类声明、模板声明、内联函数
2.防止重复定义,防止二次包含,#ifndef #endif
3.多个库链接,两个编译器可能为同一个函数生成不同修饰名称,最好是同一个编译器编译生成的库。
二、存储持续性、作用域和链接性
1.存储数据方案:自动存储,静态存储static,线程存储thread_local,动态存储new,存放于heap堆。
2.作用域,名称在文件的多大范围可见;链接性,描述了名称如何在不同单元间共享。
3.auto用于c++,自动类型推断。c语言为自动作用域。
4.栈,内存存储方向为,自下向上增长
5.register寄存器变量,访问速度较快。
6.static变量,外部链接性:全局,内部链接性:文件内部static,无链接性:函数内部。未初始化的静态变量为0。
7.constexpr创建常量表达式的方式
8.静态持续性,外部链接性,(1)使用::访问全局变量。例如局部定义了warming,全局也定义了warming,可使用::warming访问全局。其他情况,局部会覆盖全局。(2)extern声明访问,单一定义原则。
9.volatile去除编译器优化,编译器将值存储至寄存器中,volatile每次从内存中取值。
10.mutable,即使结构或类的为const,某个成员也可能被修改。
11.const修改全局变量的链接性为内部,相当于static。其他文件调用需加extern,但是每个文件有同一组常量,是属于自己的。
12.extern const int states = 50;默认加const,修改常量的链接性为内部,但可用extern覆盖,此时其他文件共享常量。
13.函数链接性:单定义规则,用于非内联函数。内联函数可防在头文件中,包含了头文件的每个文件都有一份内联函数的定义。
14.语言链接性:
(1)C++将函数翻译时,执行名称矫正或名称修饰。C只是翻译。
extern “C” void spiff(int);//c语言方式
extern void spiff(int);//隐式c++
extern “C” void spiff(int);//显式c++
15.动态存储
(1)new失败时不会返回空指针,引发异常std::bad_alloc
(2)原型
void * operator new(std::size_t);
void * operator new[](std::size_t);
(3)定位new运算符
a、默认从heap上分配,也可指定地点申请满足大小的内存块。
b、
例1为常规,例2为buffer中申请int,例3为buffer中申请40个int。
int *p1 = new int;//new(sizeof(int))
int *p2 = new(buffer) int; //new(sizeof(int), buffer)
int *p3 = new(buffer) int[40]; //new(40*sizeof(int), buffer),都为接收2个参数。
c、delete只可删除常规申请的内存,对于定位new,不可删除,会段错误。
三、名称空间
1.声明区域 > 潜在作用域,潜在作用域可能会被局部变量覆盖。
2.名称空间特性,开放的,后续可追加。
3.不可位于代码块中,通过作用域解析运算符::访问。
4.using 编译指令和using声明。声明可使一个变量可用,编译指令使得所有名称都可用。
编译指令,增加了名称冲突的可能性。
using Jill::fetch;//覆盖局部变量
using namespace Jill;//使用所有名称
5.采用编译指令包含整个命名空间后,可定义局部变量,全局变量,访问命名空间变量。分别采用,局部,::全局,命名空间::变量的形式。
6.作用域不同,覆盖的范围不同。
(1)使用using声明将名称空间的名称导入声明区域,报错。
(2)使用using编译指令将名称空间的名称导入声明区域,局部版本将隐藏名称空间版本。
7.(1)嵌套使用名称空间(2)open是可传递的(3)创建别名,namespace a = b;简化对嵌套名称空间的调用。(4)未命名的名称空间,仅可在声明点到该声明区域结尾。不可使用using调用,不可在其他文件中调用。
8.using声明导入函数名,不需要描述返回类型和特征标。如果函数被重载,全部导入。
9.尽可能少的使用using编译,尽可能多的使用命名空间。