C++学习笔记--new和namespace
2017-11-21 12:02
211 查看
内存申请
在C中我们学习了动态内存分配(小知识:一般动态分配回来的内存空间比需要的略大)的函数,为什么我们在C++中还要学习新的内存分配方式?那是因为C中的malloc、calloc、等都不是C中自带的,而是通过库函数调用得到的,对于一些不支持这些库编译器就无法使用。C++中使用new关键字(表面是C++自带的,不取决于编译环境使用)进行动态内存分配,在C中的动态内存分配是基于字节分配的,但是C++中是基于类型来进行动态内存分配的,在使用完后通过delete关键字来释放内存。new有两种方式申请,对单个变量类型申请和对数组申请。
变量申请:type *p = new type;
...
...
delete p;
数组申请:type *p = new type
;
...
...
delete []p;//区别与单个变量的释放
在进行new分配单个变量类型的内存时可以对申请的空间进行初始化,如;
int *pi = new int(1);
float *pf = new float(2.0f);
char * pc = new char('a');
注意:int *p = new int(2);区别于int *p = new int[2]; //前者是进行初始化,后者却是申请一片连续的空间
Test *pm = new Test();//在堆中创建一个对象。
new与malloc的区别:
1、new关键字是C++的一部分,malloc是由C库提供的函数。
2、new以具体类型为单位进行内存分配,malloc以字节为单位进行内存分配。
3、new在申请单个类型变量时可以进行初始化,malloc不具备初始化的特性。
4、malloc仅仅根据需要申请一定量的内存空间。
5、用new申请一个类对象时会触发调用构造函数,用malloc申请同样大小空间时只是返回这一片内存的首地址。
6、对象的创建只能用new,malloc不适合用于面向对象开发。
7、释放内存时,delete会触发析构函数的调用,使对象彻底被销毁,free仅仅是释放申请回来的内存空间,但是指针本身依然存在。
8、delete和free不能混用,如果用delete释放malloc申请的空间,由于malloc申请的空间并不会生成一个合法的对象,调用析构函数可能引起程序崩溃;如果用free释放new申请的空间可能导致对象未被销毁而导致内存泄漏。
命名空间
C中只有一个全局作用域,所有的全局标识符共享一个作用域,这样就可能导致标识符之间发生冲突,所以C++为了更好的处理这种情况就提出了命名空间的概念,命名空间将全局作用域(全局作用域也叫默认命名空间)分成不同的部分,这样就使不同命名空间部分里的标识符即便重名也不会发生冲突。
可以看出命名空间的定义还是比较简单的,并且它还可以嵌套定义。
使用整个命名空间:
using namespace Name1;
i = 3;//先说明再使用
k = 5;
使用命名空间中的变量:
using Name1 :: i; i = 3;//先说明再使用
using Name1 :: Name2 :: j; j = 2;//先说明再使用
Name1 :: i = 4;//直接使用
使用默认命名空间中的变量:
:: x;
在C中我们学习了动态内存分配(小知识:一般动态分配回来的内存空间比需要的略大)的函数,为什么我们在C++中还要学习新的内存分配方式?那是因为C中的malloc、calloc、等都不是C中自带的,而是通过库函数调用得到的,对于一些不支持这些库编译器就无法使用。C++中使用new关键字(表面是C++自带的,不取决于编译环境使用)进行动态内存分配,在C中的动态内存分配是基于字节分配的,但是C++中是基于类型来进行动态内存分配的,在使用完后通过delete关键字来释放内存。new有两种方式申请,对单个变量类型申请和对数组申请。
变量申请:type *p = new type;
...
...
delete p;
数组申请:type *p = new type
;
...
...
delete []p;//区别与单个变量的释放
在进行new分配单个变量类型的内存时可以对申请的空间进行初始化,如;
int *pi = new int(1);
float *pf = new float(2.0f);
char * pc = new char('a');
注意:int *p = new int(2);区别于int *p = new int[2]; //前者是进行初始化,后者却是申请一片连续的空间
Test *pm = new Test();//在堆中创建一个对象。
new与malloc的区别:
1、new关键字是C++的一部分,malloc是由C库提供的函数。
2、new以具体类型为单位进行内存分配,malloc以字节为单位进行内存分配。
3、new在申请单个类型变量时可以进行初始化,malloc不具备初始化的特性。
4、malloc仅仅根据需要申请一定量的内存空间。
5、用new申请一个类对象时会触发调用构造函数,用malloc申请同样大小空间时只是返回这一片内存的首地址。
6、对象的创建只能用new,malloc不适合用于面向对象开发。
7、释放内存时,delete会触发析构函数的调用,使对象彻底被销毁,free仅仅是释放申请回来的内存空间,但是指针本身依然存在。
8、delete和free不能混用,如果用delete释放malloc申请的空间,由于malloc申请的空间并不会生成一个合法的对象,调用析构函数可能引起程序崩溃;如果用free释放new申请的空间可能导致对象未被销毁而导致内存泄漏。
命名空间
C中只有一个全局作用域,所有的全局标识符共享一个作用域,这样就可能导致标识符之间发生冲突,所以C++为了更好的处理这种情况就提出了命名空间的概念,命名空间将全局作用域(全局作用域也叫默认命名空间)分成不同的部分,这样就使不同命名空间部分里的标识符即便重名也不会发生冲突。
in 4000 t x = 1;//默认作用域里的变量 namespace Name1 { int i = 0; namespace Name2 { ... ... int j = 1; } ... ... int k = 1; }
可以看出命名空间的定义还是比较简单的,并且它还可以嵌套定义。
使用整个命名空间:
using namespace Name1;
i = 3;//先说明再使用
k = 5;
使用命名空间中的变量:
using Name1 :: i; i = 3;//先说明再使用
using Name1 :: Name2 :: j; j = 2;//先说明再使用
Name1 :: i = 4;//直接使用
使用默认命名空间中的变量:
:: x;
相关文章推荐
- C++学习笔记:New和Delete
- 【C++学习笔记】使用New来创建动态数组
- C++学习笔记:New和Delete
- C++基础学习笔记----第十四课(new和malloc的区别、单例模式等深入)
- 【C++学习笔记】一个使用new和delete的实例
- C++学习笔记四之使用new来创建动态数组
- C++学习笔记:C++中的new
- C++学习笔记之:关于类的一些补充测试(new和new[]/private构造/explicit等)
- C++学习笔记--重载new和delete
- C++学习笔记之1:使用相同形式的new和delete
- C++ 学习笔记(12)动态内存、智能指针、new和delete、动态数组、allocator
- C++学习笔记之1:使用相同形式的new和delete
- C++学习笔记(七)malloc、free、 new、delete与二维数组
- C++基础学习笔记----第十四课(new和malloc的区别、单例模式等深入)
- C++学习笔记---new/delete
- C++学习笔记3:new
- C++学习笔记之---namespace的使用
- 【C++学习笔记】使用new创建动态结构
- Effective C++学习笔记:对应的new和delete要采用相同的形式
- 【C++】学习小笔记系列-1-new和delete的实际过程。