C++命名空间知识点总结

引入

在 C++ 应用程序中。可能会写一个名为 xyz() 的函数,在另一个可用的库中也存在一个相同的函数 xyz()。这样,编译器就无法判断所使用的是哪一个 xyz() 函数。

因此,引入了命名空间这个概念,专门用于解决上面的问题,它可作为附加信息来区分不同库中相同名称的函数、类、变量等。使用了命名空间即定义了上下文。本质上,命名空间就是定义了一个范围。

我们举一个计算机系统中的例子,一个文件夹(目录)中可以包含多个文件夹,每个文件夹中不能有相同的文件名,但不同文件夹中的文件可以重名。

命名空间

定义

命名空间的定义使用关键字 namespace,后跟命名空间的名称,如下所示:

复制代码
namespace namespace_name {
// 代码声明
}

调用

为了调用带有命名空间的函数或变量,需要在前面加上命名空间的名称,指定所使用的函数或变量时需要用到"::"操作符,"::"操作符是域解析操作符。如下所示:

复制代码
name::code;  // code 可以是变量或函数 

实例

c++ 复制代码
#include<iostream>
using namespace std;

namespace myName
{
    int x=5;
}

int main()
{
    int x=1;
    cout<<x<<endl;
    cout<<myName::x<<endl;
    return 0;
}

输出结果为:

1

5

using指令

除了直接使用域解析操作符::,还可以采用using声明(using declaration)

例1(常用)

可以使用 using namespace 指令,这样在使用命名空间时就可以不用在前面加上命名空间的名称。这个指令会告诉编译器,后续的代码将使用指定的命名空间中的名称。

c++ 复制代码
#include <iostream>
using namespace std;
 
// 第一个命名空间
namespace first_space{
   int a;
   void func(){
      cout << "Inside first_space" << endl;
   }
}
// 第二个命名空间
namespace second_space{
   int a;
   void func(){
      cout << "Inside second_space" << endl;
   }
}
using namespace first_space;
int main ()
{
 
   // 调用第一个命名空间中的函数
   func();
   
   return 0;
} 

当上面的代码被编译和执行时,它会产生下列结果:

c++ 复制代码
Inside first_space 

例2

using 指令也可以用来指定命名空间中的特定项目。例如,如果您只打算使用 first_space 命名空间中的变量a,您可以使用如下的语句:

c++ 复制代码
using first_space::a; 

随后的代码中,在使用first_space命名空间的变量a时就可以不用加上命名空间名称作为前缀,但是first_space命名空间中的其他项目仍然需要加上命名空间名称作为前缀。

总结

C++ 标准的命名空间为 std ,包含很多标准的定义。头文件iostream文件中定义的所有变量、函数等都位于std命名空间中,每次使用iostream中的变量或函数都需要在前面加上std::是非常麻烦的一件事,为此可直接用using声明将std中的所有变量或函数等都声明出来。 如果不用using namespace std;这一语句,则程序应该像下面这样:

c++ 复制代码
#include<iostream>
int main(){
    std::cout<<"hello world!"<<std::endl;
    return 0;
} 

使用using namespace std;这一语句后,则程序应该像下面这样:

c++ 复制代码
#include<iostream>
using namespace std;
int main(){
    cout<<"hello world!"<<endl;
    return 0;
} 

命名空间的嵌套

命名空间可以嵌套,可以在一个命名空间中定义另一个命名空间,如下所示:

c++ 复制代码
namespace namespace_name1 {
   // 代码声明
   namespace namespace_name2 {
      // 代码声明
   }
} 

可以通过使用 :: 运算符来访问嵌套的命名空间中的成员:

复制代码
// 访问 namespace_name2 中的成员
using namespace namespace_name1::namespace_name2;
 
// 访问 namespace_name1 中的成员
using namespace namespace_name1; 

// 访问 namespace_name2 中的成员
using namespace namespace_name1::namespace_name2;
 
// 访问 namespace_name1 中的成员
using namespace namespace_name1; 
相关推荐
世转神风-2 分钟前
qt-通信协议基础-double转成QbyteArray-小端系统
开发语言·qt
web3.088899913 分钟前
小红书笔记评论API接口详情展示
开发语言·笔记·python
手抄二进制14 分钟前
使用Anaconda创建python环境并链接到Jupyter
开发语言·python·jupyter
水饺编程29 分钟前
Visual Studio 软件操作:添加附加依赖项
c语言·c++·windows·visual studio
古城小栈35 分钟前
go-zero 从入门到实战 全指南(包的)
开发语言·后端·golang
lsx2024061 小时前
Python 3 函数
开发语言
-To be number.wan1 小时前
C++ 进阶技巧:如何让 cout << 自定义对象 正常输出?
开发语言·c++
2501_944446001 小时前
Flutter&OpenHarmony状态管理方案详解
开发语言·javascript·flutter
一路往蓝-Anbo1 小时前
C语言从句柄到对象 (三) —— 抛弃 Malloc:静态对象池与索引句柄的终极形态
c语言·开发语言·数据结构·stm32·单片机·算法
lbb 小魔仙1 小时前
【Java】Spring Data JPA 详解:ORM 映射、查询方法与复杂 SQL 处理
java·开发语言·sql·spring cloud