第10课 C++中的新成员(new和delete)

1. 动态内存分配

(1)C++通过new关键字进行动态内存申请是以类型为单位申请空间大小的

(2)C++通过delete关键字用于内存释放

    

    ▲注意释放数组时要加[],否则只释放这个数组中的第1个元素。

【实例分析】C++中的动态内存分配  10-1.cpp

#include <stdio.h>

 

int main()

{

    int* p = new int;

 

    *p = 5;

    *p = *p + 10;

 

    printf("p = %p
", p);  //p保存堆上开辟空间的地址

    printf("*p = %d
", *p);//15

 

    delete p;

 

 

    p = new int[10];//申请10个int型空间

 

    for(int i=0;i<10; i++)

    {

        p[i] = i + 1;

        printf("p[%d] = %d
", i, p[i]);

    }

 

    delete[] p; //注意:释放数组时[]不能漏掉

 

    return 0;  

}

运行结果:

  

2. new关键字

(1)对比newmalloc

 

new

malloc

性质

是个关键字,属于C++的一部分

是由C提供的库函数

申请单位

具体类型为单位

字节为单位

内存初始化

申请单个类型变量进行初始化

不具备内存初始化的特性

(2)new关键字初始化

int* pi = new int(1);

float* pf = new float(2.0f);

char* pc = new char('c');

【编程实验】初始化动态内存  10-2.cpp

#include <stdio.h>

 

int main()

{

    int* pi = new int(1); //开辟1个int型空间,并初始化为1

    //int* pa = new int[1];//注意,这时申请一个数组,与前一行含义不同

 

    float* pf = new float(2.0f);

    char* pc = new char('c');

 

    printf("*pi = %d
", *pi); //1

    printf("*pf = %f
", *pf); //2.000000

    printf("*pc = %c
", *pc); //c

 

    delete pi;

    delete pf;

    delete pc;

 

    return 0;  

}

运行结果:

  

3. C++中的命名空间

(1)C语言只有一个全局作用域

  ①C语言所有的全局标识符共享同一个作用域

  ②标识符之间可能发生冲突

(2)C++中提出了命名空间的概念

  ①命名空间全局作用域分成不同的部分

  ②不同命名空间中的标识符可以同名不会发生冲突

  ③命名空间可以相互嵌套

  ④全局作用域也叫默认命名空间

(3)C++命名空间的定义namespace Name { }

      

(4)命名空间的使用

  ①使用整个命名空间using namespace name;

  ②使用命名空间中的变量using name::variable;

  ③使用默认命名空间中的变量: ::variable

【实例分析】命名空间的使用  10-3.cpp

#include <stdio.h>

 

namespace First
{

    int i = 0;

}

 

namespace Second
{

    int  i = 1;

 

    //命名空间的嵌套
    namespace Internal
    {

        struct P

        {

            int x;

            int y;

        };

    }

}

 

int main()
{

    using namespace First;//使用First整个命名空间

    using Second::Internal::P;//使用命名空内部的P结构体

 

    printf("Fisrt::i = %d
", i); //0。可以直接写i,因为使用了First整个命名空间

    printf("Second::i = %d
", Second::i);//1。须带命名空间的名字

 

    P  p = {2, 3};

 

    printf("p.x = %d
", p.x);//2

    printf("p.y = %d
", p.y);//3

 

    return 0;  

}

运行结果:

  

4. 小结

(1)C++中内置了动态内存分配专用关键字

(2)C++中的动态内存分配可以同时进行初始化

(3)C++中的动态内存分配基于类型进行的

(4)C++命名空间概念用于解决名称冲突问题

原文地址:https://www.cnblogs.com/hoiday/p/10089232.html