1. 动态内存分配
(1)C++通过new关键字进行动态内存申请,是以类型为单位来申请空间大小的
(2)delete关键字用于内存释放
▲注意释放数组时要加[],否则只释放这个数组中的第1个元素。
【实例分析】C++中的动态内存分配
#include <stdio.h> int main() { int* p = new int; *p = 5; *p = *p + 10; printf("p = %p\n", p); //p保存堆上开辟空间的地址 printf("*p = %d\n", *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\n", i, p[i]); } delete[] p; //注意:释放数组时[]不能漏掉 return 0; }
2. new关键字
(1)对比new和malloc
|
new |
malloc |
性质 |
是个关键字,属C++的一部分 |
是由C库提供的函数 |
申请单位 |
以具体类型为单位 |
以字节为单位 |
内存初始化 |
申请单个类型变量时可进行初始化 |
不具备内存初始化的特性 |
(2)new关键字的初始化
int* pi = new int(1);
float* pf = new float(2.0f);
char* pc = new char('c');
【编程实验】初始化动态内存
#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\n", *pi); //1 printf("*pf = %f\n", *pf); //2.000000 printf("*pc = %c\n", *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
【实例分析】命名空间的使用
#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\n", i); //0。可以直接写i,因为使用了First整个命名空间 printf("Second::i = %d\n", Second::i);//1。须带命名空间的名字 P p = {2, 3}; printf("p.x = %d\n", p.x);//2 printf("p.y = %d\n", p.y);//3 return 0; }
4. 小结
(1)C++中内置了动态内存分配的专用关键字
(2)C++中的动态内存分配可以同时进行初始化
(3)C++中的动态内存分配是基于类型进行的
(4)C++中命名空间概念用于解决名称冲突问题