小言_互联网的博客

命名空间、using声明和编译指令、struct类型加强--- 2021.5.1

417人阅读  评论(0)

命名空间:

为什么引入命名空间?

众所周知,我们在使用编程语言c来编写代码时,往往会遇到移植代码一直不过去或者一直难度很大的问题,其中就与在自己已经建好的工程文件下,定义好的变量是可以正常使用的,但是如果移植到其他的工程文件下,就可能会遇到变量重复定义的问题。那为了解决这个问题,同时另一方面增加代码的容错率,所以c++中就引入了命名空间的这个概念。

什么是命名空间?
  1. 我们一般在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中定义了两个不同的命名空间,分别为AB。只不过这两个命名空间中的成员函数是相同的。那么如果我们在其他的cpp文件中想要通过命名空间来调用函数func时,我们需要在函数名前加上命名空间的名字和作用域运算符::即可。如上所示A::func()。那这里的作用域运算符::又是什么呢?我们在c专栏内存分布一篇中,提到了我们定义的变量都是有对应的作用域的。同样我们也可以这样理解,我们既然想要使用命名空间A中的成员函数func,那么我们首先需要先找到这个命名空间A的具体位置,也就是其作用域,找到后我们才能正常对其内部进行访问。这个概念可以参照指针概念来理解。

  1. 并且命名空间是可以嵌套命名空间的,类似于c语言中的结构体嵌套。如下所示:
namespace Maker
{
   
	int a;
	namespace B
	{
   
		int b;
	}
}
  1. 命名空间只能写在全局中,类似于全局变量,不能放在局部中。

using声明和编译指令:

既然我们定义了命名空间之后我们该怎样来使用呢?

细心的小伙伴会发现在上一个例子中有using namespace std;这个字样,意味着我们如果想要通过命名空间来调用其成员变量或者函数时,只需要在前面加上using声明即可。

struct类型加强:

  1. 我们在c语言中使用结构体时,结构体中只能定义变量,不能定义函数。但是c++对其进行了加强,我们是可以在结构体内定义函数的。

  2. c语言中我们一般定义变量需要在前面添加struct关键字对其进行声明,才可以使用结构体内部的成员变量,在c++中我们定义变量时不需要使用struct

结束语

如果觉得这篇文章还不错的话,记得点赞 ,支持下!!!


转载:https://blog.csdn.net/qq_40544107/article/details/116331958
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场