【c++ 】内存模型与命名空间

6d63dc5dd3994f75ae53a20768cc10f6.gif

🏆 个人主页:🎈 @太阳哥哥 🎈

🎁 本文收录专栏:🎈C++学习之路 🎈

🛒 其他专栏:🎈 ARM学习之路 🎈

📝 学习格言:路漫漫其修远兮,吾将上下而求索

💡 欢迎点赞、关注、收藏( •̀ ω •́ )✧   一起努力,一起学习!

目录

前言

1、命名空间(namespace)的使用

1.1、有名空间

2、作用域

2.1、局部作用域

2.2、全局作用域

2.3、类作用域

2.4、命名空间作用域

3、动态内存

3.1、malloc/free和new/delete的异同处


前言

        当用户编写代码的时候,定义了一个变量a,在这程序中还有另一个变量a,同时有了两个的变量a,此时若执行该程序,则会报错,因为在执行时编译器分不清使用的哪个变量a,所以引出命名空间概念。

1、命名空间(namespace)的使用

        命名空间(名字空间):在全局范围之内取一块区域命名名称。命名空间可以分为有名空间、无名空间

        作用:是为了解决C++程序中标识符重名的问题。

1.1、有名空间

格式: namespace 标识符的名称 { //代码块或者是语句块 } 例如:

namespace  zhang
{
    int a;
}

访问命名空间里的内容: 访问格式:

(1)命名空间的名称 ::需要访问的内容

        zhang ::a;

(2)using 命名空间的名称 ::需要访问的内容

        using  zhang::a;//如果后面用到a,那就表明是命名空间里的a

(3)using namespace 命名空间的名称;

        using namespace zhang;

1.2、无名空间

格式: namespace 表示声明的无名的命名空间 { //代码块或者语句块 } 例如:

        namespace
        {
            int a;
        }

格式:   ::(作用域符号)需要访问的内容

程序示例:

#include <iostream>
​
using namespace std;//使用命名空间
​
namespace Test//有名空间 Test
{
    int test = 1;
}
int main()
{
    using Test::test;//使用 作用域(::) 符号访问
    cout << test << endl;//输出命名空间 Test 内部变量 test = 1
​
    return 0;
}

注: (1)命名空间是可以发生嵌套。

        (2)命名空间可以分为有名的命名空间和无名的命名空间。

        (3)命名空间是属于全局的一部分,取全局的一块区域命了一个名称。

        (4)访问命名空间的时候需要用到域作用符号。

2、作用域

        作用域可分为:局部作用域、全局作用域、类作用域、命名空间作用域

2.1、局部作用域

        在一个函数内部定义的变量,作用范围只限于本函数体内。在函数体内{}、代码块{}、for()循环、while()循环里等等的区域,称之为局部作用域。局部作用域的生命周期,当程序执行到本函数才会给局部变量分配内存单元,函数执行完毕后,局部变量所占的存储单元就会释放。

void function(int a)//a只在函数体内有效
{
​
}

2.2、全局作用域

        除局部作用域以外的区域都可以认为是全局作用的区域,那么如果变量声明或者是定义在全局作用域,那么它的生命周期是整个文件。

int a=10;
int main()
{
​
}

2.3、类作用域

         体内的区域,称之为类作用域,如果变量声明或者是定义在类体内,那么它的生命周期只在该类存在,超出这个类就失效。

class  Student
{
    int a;
};

2.4、命名空间作用域

        命名空间作用域是属于全局的一部分,它实质也是全局的内容,如果变量声明或者是定义在命名空间作用域里,那么它的生命周期也是命名空间里的区域。

namespace zhang                
{
    int a;
}

3、动态内存

        动态内存:程序在运行时才分配的空间,称之为动态内存。C++提供了new和delete操作符来操作堆区的空间,C++中的动态内存分配是基于类型进行的。

  • new:用于开辟堆区空间,相当于是C里的malloc

  • delete:用于释放堆区空间,相当于是C里的free

        操作符:new

        使用格式1:数据类型 * 标识符名称 = new 数据类型 ;

int   * p  = new int  ;

        使用格式2:数据类型 * 标识符名称 = new 数据类型[n] ;

int * p = new int[10] ;//数组型,第一种格式
    
int * q ;
q = new int[10];//第二种格式

        初始化:

int   * p  = new int(10)  ;
int *arr = new int[5]{1,2,3,4,5};

        操作符:delete

        使用格式:

delete p;//释放普通类型
delete []p;//释放数组类型

 示例程序:

#include <iostream>
​
using namespace std;
​
int main()
{
    int* p = new int;
    *p = 5;
​
    cout << p << endl;//输出 p 的地址
    cout << *p << endl;//输出值为 5
​
    delete p;
​
    /********************************/
​
    int* q = new int[10];
    for (int i = 0; i < 10; i++)
    {
        q[i] = i + 1;
        cout << q [i] << endl;
    }
​
    delete[] p;
​
    return 0;
}

        我们程序请求的动态内存由系统从内存堆中分配。 计算机内存是一种有限的资源,有时候可能会耗尽。

3.1、malloc/free和new/delete的异同处

        相同之处:malloc/free和new/delete都是在堆区申请空间和释放堆区空间。

        不同之处:

  • C里的malloc/free是函数,C++里new/delete是操作符。
  • C里的malloc/free开辟堆区空间的时不能初始化,C++里的new/delete开辟空间的时候能进行初始化工作。
  • C里的malloc/free开辟堆区空间的时候需要手动的去计算空间的大小,C++里的new/delete开辟空间的时候自动计算空间的大小。
  • C里的malloc/free开辟堆区空间的时候需要强制类型转换,C++里的new/delete开辟空间的时候不需要强制类型转换。
  • C里的malloc/free只做了开辟堆区空间的工作,C++里的new/delete开辟空间的时候,不仅开辟了空间,而且还可以执行构造函数。

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

漫漫长夜想学习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值