命名空间和using namespace std的详解【C++】

简介: 命名空间和using namespace std的详解【C++】

命名空间和using namespace std的详解

命名空间

一.命名空间定义:

1.在C语言中只有一个全局作用域:

所有的全局标识符共享一个作用域

这使得标识符之间可能发生冲突。

2.C++中提出了命名空间的概念:

命名空间将全局作用域分成不同的部分

不同命名空间中的标识符可以同名而不会发生冲突

命名空间可以发生嵌套

全局作用域也叫默认命名空间

二.为什么用命名空间

在这里插入代码片
#include <stdio.h>
#include <string.h>
int strlen = 10;
int main()
{
  printf("%d", strlen);
  return 0;
}

执行会报错:“strlen”: 重定义;以前的定义是“函数”

意思就是说,我们定义的变量名strlen与string.h库的strlen函数名冲突了,因为同一个作用域里面不能有相同的名称,但是C语言没办法解决这种问题,所以C++中引入了命名空间这个概念。

其实还有一个原因就是当一个项目需要多个人写的时候,就难免会出现名称冲突的情况,这时候如果是C语言我们对于这种问题只能要求程序员之间去修改名称,但是如果是C++的话,我们可以用命名空间,来允许多个名称相同的情况。 对此ANSI C++引入的可以由用户命名的作用域,用来处理程序中常见的同名冲突。命名空间是用来限定名字的解析和使用范围,它是C++开发大型程序的工具之一。命名空间的原理是将全局作用域划分为一个一个的命名空间,每个命名空间是一个独立的作用域,在不同命名空间内部定义的名字彼此之间互不影响,从而有效的避免了命名污染。

2.命名空间的定义(namespace)

定义命名空间,需要用到namespace关键字,然后加上一个命名空间的名字,最后花括号{}括起来即可
2.1 通常定义
• 1
• 2
在这里插入代码片
namespace A   //A的命名空间
{
  int a = 20;
  int b = 30;
  ...//也可以定义函数
}
namespace B //B的命名空间
{
  int a = 40;
  int b = 60;
}

2.2 嵌套定义

在这里插入代码片
namespace N1
{
  int a;
  int b;
  int Add(int left, int right)
  {
      return left + right;
  }
namespace N2//嵌套在N1中
 {
    int c;
    int d;
    int Sub(int left, int right)
    {
         return left - right;
    }
 }
}

3.域作用限定符(::)和命名空间的使用

域作用限定符 ::使用方式就是 作用域 ::变量名,如果作用域为空格则为在全局域中寻找变量。
• 1
#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
int j = 0;
namespace July
{
  int J = 10;
  int U = 11;
  namespace July1
  {
    int L = 20;
    int Y = 21;
  }
}
using namespace July;//释放July的命名空间,
int main()
{
  printf("%d\n", July1::L);//L是嵌套在July1中的变量,
  printf("%d\n", J);//因为释放了July,打开了该命名空间中的所有变量,函数,方法;所以使用的是命名空间中的变量J,就不用在家作用域
  //printf("%d\n", July::J);就不用这么写了
  //如果没有Using name July ,那么,此时使用J变量是会报错,
  return 0;
}

命名空间的使用方式

1.加命名空间名词和域作用限定符

命名空间::变量

#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
namespace July
{
  int J = 10;
  int U = 11;
}
int main()
{
  printf("%d\n", July::J);//看这里
  return 0;
}

2.使用using将命名空间中某个成员引入

这种方式也叫局部展开,就是把命名空间中的一些变量在全局域中展开了。

using 命名空间 ::变量

#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
namespace July
{
  int J = 10;
  int U = 11;
  namespace July1
  {
    int L = 20;
    int Y = 21;
  }
}
using July::J;//这种方式也叫局部展开,就是把命名空间中的一些变量在全局域中展开了。
int main()
{ 
  printf("%d\n",J);
  return 0;
}```

3.使用using namespace 命名空间名称 引入

这种方式也叫全局展开,就是把命名空间中的所有变量在全局域中展开。
#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
namespace July
{
  int J = 10;
  int U = 11;
  namespace July1
  {
    int L = 20;
    int Y = 21;
  }
}
using namespace July;//释放July的命名空间,即可以直接使用里面的所有变量,函数等等
int main()
{
  printf("%d\n",J);
  printf("%d\n",U);
  printf("%d\n", July1:: L);
  printf("%d\n", July1:: Y);
  //可以使用全部
  return 0;
}

以小见大: using namespace std 也就是这样的道理,只是说std里面包含了C++标准程序库中的所有 变量,函数,对象。然哥个人理解,

using namespace std

一. using namespace std是什么

1.打开标准命名空间,即告诉编辑器我们将要使用名字空间std中的函数或者对象。

2.using 意思就是正在使用的意思。

3.namespace 在 C++ 中被提出来,用来解决 C语言 不能重定义的问题

namespace 被称为 命名空间 ,作用就是 将变量 或 函数等 规划到了不同的作用域 ,这样就起到了 将变量隔离的效果,就不用再担心会有重定义的现象发生了。

4.std:是个名称空间标识符,C++标准库中的函数或者对象都是在命名空间std中定义的,所以我们要使用标准库中的函数或者对象都要用std来限定。

二.using namespace std为什么少用

1.标准库是不断更新的,更新后std新增的标准库命名可能会和更新前我们代码中自定义的命名冲突,所以不建议代码中直接把std全部导入,用到什么导什么,最安全。

2.使用后你的整个代码将无法使用与std标准库中的名字。不使用using namespace std就是为了 有效的防止命名冲突

3.标准库里的变量&函数非常多且命名方式不唯一,当你项目的代码量足够大时很难保证不与标准库内的命名恰好一样,我们在做项目时一般都会用自己定义的变量/函数实现一些功能,允许这些自己的东西在全局使用才是我想要的,而不是我每次使用自己的东西还要通过命名空间去取,这样反倒更影响我写代码的效率了。

以上内容仅个人学习随记,如有不对,敬请指导!



相关文章
|
5月前
|
存储 前端开发 安全
C++一分钟之-未来与承诺:std::future与std::promise
【6月更文挑战第27天】`std::future`和`std::promise`是C++异步编程的关键工具,用于处理未完成任务的结果。`future`代表异步任务的结果容器,可阻塞等待或检查结果是否就绪;`promise`用于设置`future`的值,允许多线程间通信。常见问题包括异常安全、多重获取、线程同步和未检查状态。解决办法涉及智能指针管理、明确获取时机、确保线程安全以及检查未来状态。示例展示了使用`std::async`和`future`执行异步任务并获取结果。
90 2
|
1月前
|
安全 程序员 编译器
【C++】如何巧妙运用C++命名空间:初学者必备指南
【C++】如何巧妙运用C++命名空间:初学者必备指南
|
2月前
|
安全 C++
C++: std::once_flag 和 std::call_once
`std::once_flag` 和 `std::call_once` 是 C++11 引入的同步原语,确保某个函数在多线程环境中仅执行一次。
|
3月前
|
程序员 C++ 开发者
C++命名空间揭秘:一招解决全局冲突,让你的代码模块化战斗值飙升!
【8月更文挑战第22天】在C++中,命名空间是解决命名冲突的关键机制,它帮助开发者组织代码并提升可维护性。本文通过一个图形库开发案例,展示了如何利用命名空间避免圆形和矩形类间的命名冲突。通过定义和实现这些类,并在主函数中使用命名空间创建对象及调用方法,我们不仅解决了冲突问题,还提高了代码的模块化程度和组织结构。这为实际项目开发提供了宝贵的参考经验。
60 2
|
2月前
|
程序员 C++ 容器
C++编程基础:命名空间、输入输出与默认参数
命名空间、输入输出和函数默认参数是C++编程中的基础概念。合理地使用这些特性能够使代码更加清晰、模块化和易于管理。理解并掌握这些基础知识,对于每一个C++程序员来说都是非常重要的。通过上述介绍和示例,希望能够帮助你更好地理解和运用这些C++的基础特性。
40 0
|
3月前
|
编译器 C语言 C++
C++入门 | 命名空间、输入输出、缺省参数
C++入门 | 命名空间、输入输出、缺省参数
43 4
|
2月前
|
C语言 C++
C++(六)Namespace 命名空间
命名空间(Namespace)是为了解决大型项目中命名冲突而引入的机制。在多库集成时,不同类库可能包含同名函数或变量,导致冲突。C++通过语法形式定义了全局无名命名空间,并允许对全局函数和变量进行作用域划分。命名空间支持嵌套与合并,便于协同开发。其使用需谨慎处理同名冲突。
|
4月前
|
存储 C++ 运维
开发与运维函数问题之使用C++标准库中的std::function来简化回调函数的使用如何解决
开发与运维函数问题之使用C++标准库中的std::function来简化回调函数的使用如何解决
49 6
|
4月前
|
C++ 运维
开发与运维编译问题之在C++中在使用std::mutex后能自动释放锁如何解决
开发与运维编译问题之在C++中在使用std::mutex后能自动释放锁如何解决
65 2
|
4月前
|
安全 编译器 C++
C++一分钟之-C++中的属性命名空间
【7月更文挑战第22天】C++11引入属性作为元数据,虽无内置属性命名空间,但可通过自定义属性与命名空间组合实现类似效果。例如,创建`perf`命名空间存放`slow`和`fast`属性来标记函数性能。正确使用属性需注意位置、避免重复和确保与实现一致,以提升代码可读性和编译器理解。通过模拟属性命名空间,可以更有效地管理和使用属性。
43 1