我们之前了解了在 C 语言中动态申请内存用 malloc,在 C++ 中,通过 new 关键字进行动态内存申请。C++ 中的动态内存申请是基于类型进行的,delete 关键字用于内存释放。
变量申请:Type* pointer = new Type; delete pointer;
数组申请:Type* pointer = new Type[N]; delete[] pointer;

下来我们以代码为例看看 C++ 中的动态内存分配

#include<stdio.h>intmain(intargc,char*argv[]){int*p=newint;*p=5;*p=*p+10;printf("p=%p\n",p);printf("*p=%d\n",*p);deletep;p=newint[5];for(inti=0;i<5;i++){p[i]=i+1;printf("p[%d]=%d\n",i,p[i]);}delete[]p;return0;}

我们看看编译结果

下来我们来讲讲 new 关键字与 malloc 函数的区别:1、new 关键字是 C++ 的一部分,malloc 是由 C 库提供的函数;2、new 以具体类型为单位进行内存分配,malloc 以字节为单位进行内存分配;3、new 在申请单个类型变量时可进行初始化,malloc 不具备内存初始化的特性。

下来我们以代码为例看看 new 关键字是怎样进行初始化的

#include<stdio.h>intmain(intargc,char*argv[]){int*pi=newint(1);float*pf=newfloat(2.0f);char*pc=newchar('c');printf("*pi=%d\n",*pi);printf("*pf=%f\n",*pf);printf("*pc=%c\n",*pc);deletepi;deletepf;deletepc;return0;}

我们看看编译结果是否真如我们代码所写的那样进行了初始化。

下来我们来说个新概念,C++ 中的命名空间。在 C 语言中只有一个全局作用域,所有的全局标识符共享同一个作用域,标识符之间可能发生冲突。在 C++ 中提出了命名空间的概念,命名空间将全局作用域分成不同的部分;不同命名空间中的标识符可以同名而不会发生冲突;命名空间可以相互嵌套;全局作用域也叫默认命名空间。

C++ 命名空间的定义如下:

namespaceName{namespaceInternal{/*...*/}/*...*/}

C++ 命名空间的使用:1、使用整个命名空间:using namespace name;2、使用命名空间中的变量:using namespace::variable;3、使用默认命名空间中的变量: ::variable。

下来我们以代码为例看看命名空间是怎样进行使用的

#include<stdio.h>namespaceFirst{inti=0;}namespaceSecond{inti=1;namespaceInternal{structP{intx;inty;};}}intmain(intargc,char*argv[]){usingnamespaceFirst;usingSecond::Internal::P;printf("First::i=%d\n",i);printf("Second::i=%d\n",Second::i);Pp={2,3};printf("p.x=%d\n",p.x);printf("p.y=%d\n",p.y);return0;}

我们先是定义了空间 First,在里面定义了变量 i。定义空间 Second,在里面也定义了变量 i,并且还嵌套了另一个空间。这样重复定义同一个变量是否合法呢?看看第 27、28 行打印出什么。

我们看到编译通过,并且完美运行。通过对 new 关键字和命名空间的学习,总结如下:1、C++ 中内置了动态内存分配的专用关键字;2、C++ 中的动态内存分配可以同时进行初始化;3、C++ 中的动态内存分配是基于类型进行的;4、C++ 中的命名空间概念用于解决名称冲突问题。


欢迎大家一起来学习 C++ 语言,可以加我QQ:243343083。