当前位置: 首页 > news >正文

C++ 名称空间

一、名称空间

1.1、引入名称空间的背景

在C++中的名称可以是变量,函数,类以及类的成员。随着项目的增大,名称相互冲突的可能性也在增大。使用多个厂商的类库时,可能导致名称冲突。例如,两个库都定义了名为List,Tree和Node的类,但是定义的方式不兼容。用户可能希望使用一个库的List类,而是用另一个库的Tree类,这种冲突称为名称空间问题。C++标准提供了名称空间工具,以便更好的控制名称的作用域。

1.2、创建名称空间

可以使用namespace关键字创建名称空间,如下:

namespace Jack {int age;string name;
}

1.3、名称空间特点

1.3.1、名称空间可以是全局的,也可以位于另一个名称空间中,但是不能位于代码块中

在默认的情况下,在名称空间声明的名称的连接性为外部的。除了用户定义的名称空间外,还存在另一个名称空间–全局名称空间,它对应于文件级声明区域。因此、前面所说的全局变量现在被描述为位于全局名称空间中。下面是一个名称空间的举例,例如:

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

1.3.2、命名空间可以嵌套

可以在一个命名空间中定义另一个命名空间,例如:

namespace namespace_name1 {// 代码声明namespace namespace_name2 {// 代码声明}
}

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

// 访问 namespace_name2 中的成员
using namespace namespace_name1::namespace_name2;// 访问 namespace:name1 中的成员
using namespace namespace_name1;

1.3.3、名称空间是开放的,即可以把名称加入到已有的名称空间

这个特性可以理解成名称空间可以定义在几个不同的部分中,可以在几个不同的头文件中声明函数原型,在.ccp文件中提供函数定义。例如:

// my_header1.h
namespace Jack{void display();
}// my_header2.h
namespace Jack{void backtrace();
}// my_func.cpp
#include "my_header1.h"
#include "my_header2.h"namespace Jack{void backtrace() {// ...}void display() {// ...}
}

1.3.4、未命名的名称空间

可以通过省略名称空间的名称来创建未命名的名称空间,例如:

namespace {int count;
}

这就像后面跟着using指令一样,也就是说,在该名称空间中声明的名称的潜在作用域为:从声明点到该声明区域的末尾。从这个方面来看与全局变量类似。然而,由于这种名称空间没有名称,因此,不能显示的使用using编译指令或using声明来使它在其他位置都可以使用。具体来说,不能在未命名名称空间所属文件之外的其他文件中,使用该名称空间中的名称。这提供了连接性为内部的静态变量的替代品,例如:

namespace {int count;
}void main() {// ...
}// 上面的声明内部静态变量的方法与下面的方法等价
static int count;void main() {// ...
}
http://www.lryc.cn/news/68912.html

相关文章:

  • 作为一名普通的java程序员,我想和大家分享一下4年来的工作内容
  • CyberLink的专业视频编辑软件ActionDirector Ultra 3.0版本在win10系统的下载与安装配置教程
  • 在外远程访问公司局域网用友畅捷通T财务软件 - 远程办公
  • VariantAutoencoder(VAE)中使用生成好的模型进行声音生成
  • C++数据封装以及定义结构的详细讲解鸭~
  • MySql 数据库的锁机制和原理
  • try catch finally 里面有return的执行顺序
  • 美团前高级测试工程师教你如何使用web自动化测试
  • MySql.Data.dll 因版本问题造成报错的处理
  • 囚徒困境——从博弈论的角度解释“美女配丑男”
  • 运算符重载函数作为类的成员函数——有理数的约分
  • mysql数据库的内置函数--7
  • DS3800HPIB 有效执行任务的所有程序
  • 图像比对、人像比对和人脸识别的区别是什么?
  • python中的抽象基类
  • 耗时几个月,终于决定把原本想用于商业的系统开源了
  • HarmonyOS应用端云一体化开发主要流程
  • NoSQL之 Redis配置与优化
  • Redis哨兵模式
  • 数据库管理-第七十六期 如何升级19c RAC(20230516)
  • 组合预测模型 | ARIMA-CNN-LSTM时间序列预测(Python)
  • 实验四 面向对象分析与设计——UML类图与时序图
  • 最短路径问题
  • 国内有哪些SAAS软件?SAAS软件有哪些优点?
  • 分享两组不同的3D VR卡片
  • 外贸人如何精准开发客户?Facebook开发客户全攻略
  • 一、Git安装(Git+TortoiseGit图形化)
  • mysql死锁,如何产生?如何发现?如何处理?
  • YOLO V1-V3 简单介绍
  • 数据结构总结1:了解数据结构、时间复杂度、空间复杂度