1,这些新引入的成员想要解决 C 语言中存在的一些问题,
2,动态内存分配:
1,C++ 中的动态内存分配:
1,C++ 中通过 new 关键字进行基于类型的动态内存申请;
1,C 语言中自身不包含动态内存分配的内容,通过 malloc 库函数基于字节进行;
2,C++ 中的动态内存申请是基于类型进行的;
3,delete 关键字用于内存释放;
4,变量申请:
1 Type* pointer = new Type;
2 // ......,和 C 语言中的使用方式相同;
3 delete pointer;
5,数组申请:
1 Type* pointer = new Type[N]; // N 表示数组包含的元素个数; 2 // ......,和 C 语言中的使用方式相同; 3 delete[] pointer; // 要加上中括号,否则只释放了数组占用的第一个内存空间,剩下的内存空间都没有释放,造成内存泄漏;
3,C++ 中的动态内存分配实例分析:
1,main.cpp 文件:
1 #include <stdio.h> 2 3 int main() 4 { 5 int* p = new int; 6 7 *p = 5; 8 *p = *p + 10; 9 10 printf("p = %p\n", p); 11 printf("*p = %d\n", *p); 12 13 delete p; 14 15 printf("p = %p\n", p); 16 17 p = new int[10]; // p 所指向的这片内存空间至少占用了 40 字节; 18 19 for(int i=0; i<10; i++) 20 { 21 p[i] = i + 1; // 像数组一样使用; 22 23 printf("p[%d] = %d\n", i, p[i]); 24 } 25 26 delete[] p; 27 28 return 0; 29 }
2,输出结果:
1 p = 0x9e4e008 2 *p = 15 3 p = 0x9e4e008 //这个结果说明,释放的是指向的空间,但是这个时候指针的值还是原来的值; 4 p[0] = 1 5 p[1] = 2 6 p[2] = 3 7 p[3] = 4 8 p[4] = 5 9 p[5] = 6 10 p[6] = 7 11 p[7] = 8 12 p[8] = 9 13 p[9] = 10
3,本质上和使用 malloc 和 free 没有太大差异,只不过说在使用体验上变得更好;
4,new 关键字与 malloc 函数的区别:
1,new 关键字是 C++ 的一部分;
2,malloc 是由 C 库提供的函数;
1,如果 C 语言编译器无法提供库函数,那么 C 语言编译器无法进行动态内存分配;
3,new 以具体类型为单位进行内存分配;
4,malloc 以字节为单位进行内存分配;
5,new 在申请单个类型变量时可以进行初始化;
1,这是要注意的区别;
6,malloc 不具备内存初始化的特性;
1,calloc 先申请,然后全部设置为 0,这不是真正意义上的初始化;
5,new 关键字的初始化:
1,代码示例:
1 int* pi = new int(1); 2 float* pf = new float(2.0f); 3 char* pc = new char('c);
6,初始化动态内存编程实验:
1,main.cpp 文件:
1 #include <stdio.h> 2 3 int main() 4 { 5 int* pi = new int(1); // 申请 int 并初始化为 1; 6 // int* pa = new int[1]; // 申请一个 int 大小的数组; 7 8 float* pf = new float(2.0f); 9 char* pc = new char('c'); 10 11 printf("*pi = %d\n", *pi); 12 printf("*pf = %f\n", *pf); 13 printf("*pc = %c\n", *pc); 14 15 delete pi; 16 delete pf; 17 delete pc; 18 19 return 0; 20 }
2,输出结果:
*pi = 1
*pf = 2.000000
*pc = c
7,C++ 中的命名空间:
1,在 C 语言中只有一个全局作用域;
1,C 语言中所有的全局标识符共享同一个作用域;
1,每个函数的函数体就是局部作用域;
2,标识符之间可能发生冲突;
1,工程中能不用全局作用域就不用全局作用域,因为工程上往往很多人同时进行开发,可能造成自己和别人定义的全局变量相冲突,这样会浪费精力解决冲突;
2,C++ 中提出了命名空间的概念:
1,命