命名空间:
为什么引入命名空间?
众所周知,我们在使用编程语言c
来编写代码时,往往会遇到移植代码一直不过去或者一直难度很大的问题,其中就与在自己已经建好的工程文件下,定义好的变量是可以正常使用的,但是如果移植到其他的工程文件下,就可能会遇到变量重复定义的问题。那为了解决这个问题,同时另一方面增加代码的容错率,所以c++
中就引入了命名空间的这个概念。
什么是命名空间?
- 我们一般在
c++
中是这样使用的,具体如下:
namespace A{
//A是空间的名字,
int a;
void func()
{
}
}
对上述分析如下:
首先我们像往常一样,定义了一个整型变量a
,然后定义了一个返回类型为void类型的函数func
。但是此时此刻我们是在c++
环境中,所以可以利用命名空间的特性。为了防止变量重命名的问题,我们可以根据自己的需要更改命名空间的名字。在上述例子中,空间名为A
。那此时此刻,有另一位开发人员也想要使用变量a
和函数func
,他就可以在自己的.h
文件中,并且将命名空间的名字取名为B
即可。
比如我们在.h
中有两个命名空间,但是里面的成员函数或成员变量同名时,在.cpp
中实现函数时,需要加上命名空间。这是什么意思呢?我们可以看下面这个例子:
test.h文件
#pragma once
#include<iostream>
using namespace std;
namespace A
{
void func();
}
namespace B
{
void func();
}
test.cpp文件
#include "test.h"
void A::func()
{
cout << "func" << endl;
}
对上述分析如下:
首先我们在test.h
中定义了两个不同的命名空间,分别为A
和B
。只不过这两个命名空间中的成员函数是相同的。那么如果我们在其他的cpp
文件中想要通过命名空间来调用函数func
时,我们需要在函数名前加上命名空间的名字和作用域运算符::
即可。如上所示A::func()
。那这里的作用域运算符::
又是什么呢?我们在c
专栏内存分布一篇中,提到了我们定义的变量都是有对应的作用域的。同样我们也可以这样理解,我们既然想要使用命名空间A
中的成员函数func
,那么我们首先需要先找到这个命名空间A
的具体位置,也就是其作用域,找到后我们才能正常对其内部进行访问。这个概念可以参照指针概念来理解。
- 并且命名空间是可以嵌套命名空间的,类似于
c
语言中的结构体嵌套。如下所示:
namespace Maker
{
int a;
namespace B
{
int b;
}
}
- 命名空间只能写在全局中,类似于全局变量,不能放在局部中。
using声明和编译指令:
既然我们定义了命名空间之后我们该怎样来使用呢?
细心的小伙伴会发现在上一个例子中有using namespace std;
这个字样,意味着我们如果想要通过命名空间来调用其成员变量或者函数时,只需要在前面加上using
声明即可。
struct类型加强:
-
我们在
c
语言中使用结构体时,结构体中只能定义变量,不能定义函数。但是c++
对其进行了加强,我们是可以在结构体内定义函数的。 -
在
c
语言中我们一般定义变量需要在前面添加struct
关键字对其进行声明,才可以使用结构体内部的成员变量,在c++
中我们定义变量时不需要使用struct
。
结束语
如果觉得这篇文章还不错的话,记得点赞 ,支持下!!!
转载:https://blog.csdn.net/qq_40544107/article/details/116331958