《C++ Primer Plus》学习笔记4

《C++ Primer Plus》学习笔记4

第9章 内存模型和名称空间

===================================================================================================================
1、头文件中包含的内容
1)函数原型
2)使用#define 或者 const定义的符号常量
3)结构声明
4)类声明
5)模板声明
6)内联函数
2、在自己头文件中,应当使用引号而不是尖括号;如果文件名包含在尖括号中,则C++编译器将在存储标准头文件的主机系统的文件系统中查找,但如果文件名包含在尖括号中,则C++编译器将首先查找当前的工作目录或源代码目录。
3、头文件的管理
大多数标准C和C++头文件都使用下面这个防护方案

#ifndef COORDIN_H_
#define COORDIN_H_
//place include file contents here
#endif

4、存储持续性
C++中使用3中不同的方案来存储数据,这些方案的区别在于数据保留在内存中的时间
1)自动存储持续性
在函数定义中声明的变量包括函数参数的存储就为自动的,在程序开始执行时被创建,在执行完函数或代码块时候,使用的内存被释放。C++有两种存储持续性为自动的变量。
2)静态存储持续性
在函数定义外定义的变量和使用关键字static定义的变量的存储持续性都是静态。他们在程序的整个运行过程中都存在,C++有3种存储持续性为静态的变量。
3)动态存储持续性
用new操作符分配的内存一直存在,直到使用delete操作符将其释放或程序结束为止。这种内存的存储持续性为动态,又称为*存储。
5、如果变量存储在寄存器中,则没有内存地址,因此不能将地址操作符用于寄存器,不能获取变量的地址。

void gromb(int *)
int main()
{
    int x;
    register int y;
    gromb(&x); 
    gromb(&y); //不允许
}

6、静态持续变量
1)C++为静态存储持续性变量提供了3中链接性:外部链接性、内部链接性、无链接性。在默认情况下,静态数组和结构将每个元素或成员的所有位都设置为0.

int global = 1000; //外部链接性在代码块外面声明它
static int one_file = 50; //内部链接性在代码块声明它且使用static限定符
int main()
{
    ……
}
void functl(int n)
{
    static int count = 0;//创建没有链接性的静态持续变量,在代码块内声明它
    int llama = 0;
}

2)所有的静态持续变量都有下面的两个初始化的特征:
①未被初始化的静态变量的所有位都被设置为0
②只能使用常量表达式来初始化静态变量(常量表达式可以是字面值常量、const常量、enum常量、sizeof操作符)
3)定义声明double warming = 0.3,不能在引用声明中初始化变量,使用extern重新声明

extern double warming = 0.5; 无效
extern double warming;

4)全局变量虽然我们尽量少用,但是它也有一定的好处,可以让多个函数使用同一个数据块,常常使用const来防止数据被修改。

const char * const months[12] = 
{
    "January", "February", "March"…………
}

第一个const防止字符串被修改,第二个const确保数组中每个指针始终指向它最初指向的字符串。
7、存储说明符,
auto 将变量声明为自动变量;
register用于声明中指示寄存器存储类型
static 被用在作用域为整个文件的声明中时,表示内部链接性;被用于局部声明中,表示局部变量的存储持续性为静态的。
extern 表明引用声明,即声明引用在其他地方定义的变量。
mutable 根据const来解释它
8、如果出于某种原因,程序员希望某个敞亮的链接性为外部的,则可以使用extern关键字来覆盖默认内部链接性

extern const int states = 50;

在这种情况下,必须在所有该常量的文件中使用extern关键字来声明它,这与常规外部变量不同,定义常规外部变量时,不必使用extern关键字,但在使用该变量的其他文件中必须使用extern,另外可以初始化extern const变量,实际上,必须这么做,因为const数据必须初始化。
9、布局new操作符

#include <new>
struct chaff
{
    char dross[20];
    int slag;
};
char buffer1[50];
char buffer2[500];
int main()
{
    chaff *p1, *p2;
    int *p3, *p4;

    p1 = new chaff; //从堆中分配空间给chaff
    p2 = new int [20]; //在堆中分配空间给一个包含20的元素的int数组

    p2 = new (buffer1) chaff; //从buffer1中分配空间给结构chaff
    p4 = new (buffer2) int[20];//从buffer2中分配空间给一个包含20的元素的int数组
}

10、名称空间
1)声明区域 是可以在其中进行声明的区域,在函数外面声明全局这种变量,其声明区域为其声明所在的文件,对于在函数中声明的变量,其声明区域为其声明所在的代码块。
2)潜在作用域
变量的潜在作用域从声明开始,到其声明区域结尾,潜在作用域比声明区域小,这是由于变量必须定义后才能使用。
3)C++提供两种机制,using声明和using编译指令来简化对名称空间中名称的使用。
using声明使特定的标示符可用,using编译指令使整个名称空间可用。
4)如果名称空间和声明区域定义了相同的名称,试图使用using声明将名称空间的名称导入该声明区域,则这两个名称会发生冲突,从而出错。如果使用using编译指令将该名称空间的名称导入该声明区域,则局部版本将隐藏名称空间版本;使用using声明比使用using编译指令更加安全。由于它只导入指定的名称,如果该名称与局部名称发生冲突,编译器会发生指示,using编译指令导入所有名称,包括不需要的名称,发生冲突之后会之间覆盖,也不会发出警告。
5)不要再头文件中使用using编译指令,首先这样做掩盖了要哪些名称可用;另外,包含头文件的顺序可能影响程序的行为,如果非要使用编译指令using,应将其放在所有预处理编译指令#include之后。
6)对于using声明,首选将其作用域设置为局部而不是全局。
11、补充静态变量在整个额程序执行期间都存在,对于在函数外面定义的变量,其所属文件中位于该变量的定义后面的所有函数都可以使用它(文件作用域),并可在程序的其他文件中使用(外部链接性)另一个文件要使用这中变量,必须使用extern关键字来声明它,对于文件间共享的变量,应用一个文件中包含其定义声明(不适用extern),并在其他文件中包含引用声明(使用extern)。函数外面使用关键字static定义的变量的作用域为整个文件,但是不能用于其他文件(内部链接性),在代码块使用关键字static定义变量被限制哎该代码块内(局部作用域,无链接性),但在整个程序执行期间,它都一直存在并且保持原值。
12、在默认情况下,C++函数链接性是外部的,因此可在文件间共享,但是使用关键字static限定的函数的链接性为内部,被限制在定义它的文件。
》》》完结2014.7.18 9:50


《C++ Primer Plus》学习笔记4,布布扣,bubuko.com

《C++ Primer Plus》学习笔记4

上一篇:c语言的数组总结


下一篇:pytest文档5-fixture之conftest.py