🏆 个人主页:🎈 @太阳哥哥 🎈
🎁 本文收录专栏:🎈C++学习之路 🎈
🛒 其他专栏:🎈 ARM学习之路 🎈
📝 学习格言:路漫漫其修远兮,吾将上下而求索
💡 欢迎点赞、关注、收藏( •̀ ω •́ )✧ 一起努力,一起学习!
目录
3.1、malloc/free和new/delete的异同处
前言
当用户编写代码的时候,定义了一个变量a,在这程序中还有另一个变量a,同时有了两个的变量a,此时若执行该程序,则会报错,因为在执行时编译器分不清使用的哪个变量a,所以引出命名空间概念。
1、命名空间(namespace)的使用
命名空间(名字空间):在全局范围之内取一块区域命名名称。命名空间可以分为有名空间、无名空间
作用:是为了解决C++程序中标识符重名的问题。
1.1、有名空间
格式: namespace 标识符的名称 { //代码块或者是语句块 } 例如:
namespace zhang
{
int a;
}
访问命名空间里的内容: 访问格式:
(1)命名空间的名称 ::需要访问的内容
zhang ::a;
(2)using 命名空间的名称 ::需要访问的内容
using zhang::a;//如果后面用到a,那就表明是命名空间里的a
(3)using namespace 命名空间的名称;
using namespace zhang;
1.2、无名空间
格式: namespace 表示声明的无名的命名空间 { //代码块或者语句块 } 例如:
namespace { int a; }
格式: ::(作用域符号)需要访问的内容
程序示例:
#include <iostream>
using namespace std;//使用命名空间
namespace Test//有名空间 Test
{
int test = 1;
}
int main()
{
using Test::test;//使用 作用域(::) 符号访问
cout << test << endl;//输出命名空间 Test 内部变量 test = 1
return 0;
}
注: (1)命名空间是可以发生嵌套。
(2)命名空间可以分为有名的命名空间和无名的命名空间。
(3)命名空间是属于全局的一部分,取全局的一块区域命了一个名称。
(4)访问命名空间的时候需要用到域作用符号。
2、作用域
作用域可分为:局部作用域、全局作用域、类作用域、命名空间作用域
2.1、局部作用域
在一个函数内部定义的变量,作用范围只限于本函数体内。在函数体内{}、代码块{}、for()循环、while()循环里等等的区域,称之为局部作用域。局部作用域的生命周期,当程序执行到本函数才会给局部变量分配内存单元,函数执行完毕后,局部变量所占的存储单元就会释放。
void function(int a)//a只在函数体内有效 { }
2.2、全局作用域
除局部作用域以外的区域都可以认为是全局作用的区域,那么如果变量声明或者是定义在全局作用域,那么它的生命周期是整个文件。
int a=10; int main() { }
2.3、类作用域
在 类 体内的区域,称之为类作用域,如果变量声明或者是定义在类体内,那么它的生命周期只在该类存在,超出这个类就失效。
class Student { int a; };
2.4、命名空间作用域
命名空间作用域是属于全局的一部分,它实质也是全局的内容,如果变量声明或者是定义在命名空间作用域里,那么它的生命周期也是命名空间里的区域。
namespace zhang { int a; }
3、动态内存
动态内存:程序在运行时才分配的空间,称之为动态内存。C++提供了new和delete操作符来操作堆区的空间,C++中的动态内存分配是基于类型进行的。
new:用于开辟堆区空间,相当于是C里的malloc
delete:用于释放堆区空间,相当于是C里的free
操作符:new
使用格式1:数据类型 * 标识符名称 = new 数据类型 ;
int * p = new int ;
使用格式2:数据类型 * 标识符名称 = new 数据类型[n] ;
int * p = new int[10] ;//数组型,第一种格式 int * q ; q = new int[10];//第二种格式
初始化:
int * p = new int(10) ; int *arr = new int[5]{1,2,3,4,5};
操作符:delete
使用格式:
delete p;//释放普通类型 delete []p;//释放数组类型
示例程序:
#include <iostream>
using namespace std;
int main()
{
int* p = new int;
*p = 5;
cout << p << endl;//输出 p 的地址
cout << *p << endl;//输出值为 5
delete p;
/********************************/
int* q = new int[10];
for (int i = 0; i < 10; i++)
{
q[i] = i + 1;
cout << q [i] << endl;
}
delete[] p;
return 0;
}
我们程序请求的动态内存由系统从内存堆中分配。 计算机内存是一种有限的资源,有时候可能会耗尽。
3.1、malloc/free和new/delete的异同处
相同之处:malloc/free和new/delete都是在堆区申请空间和释放堆区空间。
不同之处:
|
|
|
|
|