您的位置:首页 > 编程语言 > C语言/C++

【C++】第9章 内存模型和名称空间 知识点总结

2017-11-05 10:55 323 查看
《C++ Primer Plus》第9章知识点总结

程序分为3部分

头文件:包含结构声明和使用这些结构的函数的原型

源代码文件:包含与结构有关的函数的代码

源代码文件:包含调用与结构相关的函数的代码

头文件常包含的内容

(1)函数原型

(2)使用#define或const定义的符号常量

(3)结构声明

(4)类声明

(5)模版声明

(6)内联函数

头文件中,如果文件名包含在尖括号内,则C++编译器将在存储标准头文件的主机系统的文件系统中查找;但如果文件名包含在双引号中,则编译器将首先查找当前的工作目录或源代码目录(或其他目录,这取决于编译器)。如果没有在哪里找到头文件,则将在标准位置查找。因此在包含自己的头文件时,应使用引号而不是尖括号

寄存器变量,关键字register

register int count_fast;

这为了提高访问变量的速度

C++存储数据的四种不同的方案

1、自动存储连续性:在函数定义中声明的变量(包括函数参数)的存储持续性为自动的,总用于为局部,没有连接性

2、静态存储连续性:在函数定义外定义的变量和使用关键字static定义的变量的存储持续性都为静态。它们为程序整个运行过程中都存在

C++为静态存储持续性变量提供了3中链接性:外部链接性(可在其他文件中访问,在
4000
代码块外面声明)、内部链接性(只能在当前文件中访问,在代码块外面声明,且使用static限定)和无连接性(只能在当前函数或代码块中访问,在代码块内部声明)

int global=1000;//外部链接性
static int one_file=50;//内部链接性
int main()
{
...
}
void funct1(int n)
{
static int count=0;//无链接性
int llama=0;
...
}
void funct2(int q)
{
...
}

由于外部连接性的功能,使得变量可以在多个文件中共享使用,但C++提供了一些规则来放反一些逻辑问题,比如单定义规则。变量只能定义一次,因此在其他文件使用时,需要使用到“引用声明extern”

引用声明关键字extern,并不进行初始化:extern int blem;

这个blem在别处定义了,这里只是进行引用

3、线程存储连续性

4、动态存储连续性

cv-限定符

(1)const

(2)volatile:表明即使程序代码没有对内存单元进行修改, 其值也可能发生变化

说明符

(1)auto:之前用于指出变量为自动变量,在C++11中,用于自动类型判断

(2)register:用于声明指示寄存器存储,在C++11中,只是显式地指出变量是自动的

(3)static

(4)extern:表明引用声明

(5)thread_local:可以与static或extern结合使用,其他情况下都不能使用多个说明符

(6)mutable:用于修改被const修饰的变量

存储方案和动态分配

使用new运算符初始化

(1)初始化内置的标量类型(int或double这些):int *pi=new int(6);

(2)初始化结构:struct where {double x;double y;double z;};

(3)初始化数组:int* ar=new int [4] {2,3,6,7};

使用new运算符定位

首先要有头文件new,它提供了这种版本的new运算符的原型;然后将new运算符用于提供了所需地址的参数。

具体用法:与常规new运算符相同,变量后面可以有方括号也可以没有

#include<new>
struct chaff
{
char dross[20];
int slag;
};
char buffer1[50];
char buffer2[500];
int main()
{
using namespace std;
chaff *p1,*p2;
int *p3,*p4;
//new 的常规用法
p1=new chaff;
p3=new int[20];
//new 的定位用法
p2=new (buffer1) chaff;//从buffer1中分配空间给结构chaff
p4=new (buffer2) int[20];//从buffer2中分配空间给一个包含20个元素的int数组
return 0;
}
名称空间
using声明和using编译指令

(1)using声明由被限定的名称和它前面的关键字using组成。例:

using Jill::fetch;完成该声明后,便可以使用名称fetch代替Jill::fetch

(2)using编译指令由名称空间名和它前面的关键字using namespace组成,它使名称空间中的所有名称都可用,而不需要使用作用域解析运算符。例:

using namespace Jack;导入Jack名称空间中所有的名称

(3)两者的区别:using声明使特定的标示符可用,using编译指令使整个名称空间可用。(一个针对单个,一个针对整体)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: