C++的内存模型和名称空间
内存模型
1.存储连续性:变量在内存中的保留的时间长度
自动存储连续性(自动变量)
在函数定义中声明的变量。它们在其所属的函数或代码块中创建,在执行完函数或代码块后释放空间。
静态存储连续性(静态变量)
在函数定义外和使用关键字static定义的变量。它们在程序整个运行过程中都存在,并且自动初始化为0。
动态存储连续性(动态变量)
使用new关键字创建的变量。他们直到使用delete运算符才释放空间。
2.作用域:描述名称在文件的可见范围
自动变量的作用域是局部的,只在定义自动变量的函数中或代码块中被访问。
静态变量的作用域:取决于它如何被定义。
函数作用域:在定义函数的名称空间或类中被访问。
类作用域:在类中定义的变量,它们的作用域是整个类。
名称空间作用域:在名称空间定义的变量,它们的作用域在整个名称空间。
3.链接性:描述名称如何在不同单元间共享
外部链接性:可在文件间共享。
内部链接性:只能在定义它的文件或函数中被共享。
变量的链接性
1.自动变量没有链接性
2.静态变量的链接性
int global = 10; // 外部链接性 static int one_file = 50; // 内部链接性 void funct1(int n){ static int count = 0; // 无链接性(作用域局部,只能在函数或代码块中被访问,但一直保留在内存中,只在启动时初始化一次.) i nt llama = 0;}
静态变量外部链接性的使用
如果要在别的文件使用外部链接性的静态变量,则需要在本文件中使用引用声明(extern关键字)。
file01.cpp
extern int cats = 20; // 定义外部变量int dogs = 22;int fileas;
file02.cpp
extern int cats; // 引用声明外部变量extern int dogs;
静态变量内部链接性的使用
file01.cpp
int num = 10; // 外部链接性
file02.cpp
static int num = 20; // 没有名称冲突,因为这里的num是内部链接性,只能在file02.cpp供该文件中的函数使用
const变量的链接性
file01.cpp
const int aaa = 100; // const变量的链接性是内部的
file02.cpp
extern const int aaa = 50; // 覆盖默认的内部链接性,成为外部的
函数的链接性
默认情况下,函数的链接性为外部的。如果添加了static则该函数的链接性为内部。
内联函数可以定义在头文件中,在头文件中定义的函数自动为内联.
名称空间(namespace)
为了解决各类库中名字冲突而诞生的。通过定义一种新的声明区域来创建命名的名称空间。
namespace Jack{ // 声明区域 string name; int age; string getName(){ return name; } struct Hill {}; ....}Jack::name = "jack"; // 访问
using声明和using编译指令
1.using声明使特定的标识符可用.
using Jack::age;
2.using编译指令使整个名称空间可用.
using namespace Jack;
3.避免与全局变量名称冲突
char fetch;namespace Jill{ double fetch;}int main(){ using Jill::fetch; cin>>fetch; // Jill::fetch cin>>::fetch; // char}
嵌套名称空间
namespace A1{ namespace A2{ string hello; }}A1::A2::hello="";
未命名的名称空间
1.它可以作为链接性为内部的静态变量的替代品
2.不能显示的使用using编译指令或声明
3.不能在未命名名称空间所属文件之外的其他文件中,使用该名称空间中的名称。