C++的内存模型和名称空间

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.不能在未命名名称空间所属文件之外的其他文件中,使用该名称空间中的名称。








转载于:https://my.oschina.net/Ccx371161810/blog/423025

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值