c++中的using namespace std;

简介: c++中的using namespace std;

在使用<iostream>中的功能时,通常会有一条using namespace std;

using namespace std; 是什么意思呢?

直接翻译过来,就是使用 名字空间(名称空间) std;

通过这条语句,我们就能使用std空间里的名称,比如cout,cin.


那么除了“using namespace std”这句能让我们使用std中的名称(cin,cout等),using namespace 还能干什么呢?

翻阅了c++primer plus(6)的9.3(名称空间)之后,对这个 namespace 有了一些了解。

第一个问题,名称空间是干什么的?为什么要造一个名称空间?

名称冲突!

举一个例子,有两个库都包含一个叫List的类,

而我们使用List类的时候,就会有两个叫List的类,

但是我们只想用第一个库的List,怎么办呢?

为了避免这个问题(名称冲突/重复),c++提供了名称空间。


第二个问题,命名空间是怎么规定的?

书上写的比较多,看起来也比较复杂,不感兴趣的可以跳过这一部分。。。

书上先从传统c++名称空间说起。介绍了两个概念:声明区域 和 潜在作用域。

声明区域书上说了几行,简单来说就是可以使用某个(已声明的)名称的区域。

举个例子,我在一个函数体内声明了一个变量,那么其 声明区域 就是 函数体内。

潜在作用域。书上说是:变量的潜在作用域从声明点开始,到其声明区域的结尾。潜在作用域比声明作用域小。

变量在潜在作用域并非都可见。比如函数中的局部变量同名时,全局变量就会被隐藏。


接着,有讲了c++新的名称空间特性。

c++新增了一个功能,定义一个新的声明区域 来 创建命名的 名称空间。

目的是提供一个声明名称 的区域。

然后给了一个例子

namespace Jack {
  double pail;
  void fetch();
  int pal;
  struct Well {};
}
namespace Jill {
  double bucket(double n) { return n; }
  double fetch;
  int pal;
  struct Hill{ };
}

命名空间的开放的,可以把名称加入进去。

namespace Jill {
  char * goose(const char *);
}
namespace Jack {
  void fetch()
  {}
}

访问名称空间的名称可以通过 作用域解析运算符(::)

Jack::pail = 12.34;
Jill::fetch = 11;

using声明


简化对名称的使用。 using 声明使特定的标识符可用。如

using Jill::fetch;

之后只要使用fetch就可表示Jill::fetch

using编译指令

using 编译指令使 一个名称空间的所有名称都可用。如

using namespace Jack;


使用using会简化对名称的使用,也会增加名称冲突的可能性。


总之,名称空间是为了避免名称冲突。但是即使使用了名称空间,如果同时使用多个using编译指令时,也会有很大的可能出现冲突。

为了避免名称冲突,最好减少使用using编译指令。

最好使用using声明,只声明特定的需要的名称(如using std::cout)。或者使用解析运算符(::)。

相关文章
|
8月前
|
存储 前端开发 安全
C++一分钟之-未来与承诺:std::future与std::promise
【6月更文挑战第27天】`std::future`和`std::promise`是C++异步编程的关键工具,用于处理未完成任务的结果。`future`代表异步任务的结果容器,可阻塞等待或检查结果是否就绪;`promise`用于设置`future`的值,允许多线程间通信。常见问题包括异常安全、多重获取、线程同步和未检查状态。解决办法涉及智能指针管理、明确获取时机、确保线程安全以及检查未来状态。示例展示了使用`std::async`和`future`执行异步任务并获取结果。
196 2
|
2月前
|
存储 对象存储 C++
C++ 中 std::array<int, array_size> 与 std::vector<int> 的深入对比
本文深入对比了 C++ 标准库中的 `std::array` 和 `std::vector`,从内存管理、性能、功能特性、使用场景等方面详细分析了两者的差异。`std::array` 适合固定大小的数据和高性能需求,而 `std::vector` 则提供了动态调整大小的灵活性,适用于数据量不确定或需要频繁操作的场景。选择合适的容器可以提高代码的效率和可靠性。
101 0
|
5月前
|
安全 C++
C++: std::once_flag 和 std::call_once
`std::once_flag` 和 `std::call_once` 是 C++11 引入的同步原语,确保某个函数在多线程环境中仅执行一次。
|
5月前
|
C语言 C++
C++(六)Namespace 命名空间
命名空间(Namespace)是为了解决大型项目中命名冲突而引入的机制。在多库集成时,不同类库可能包含同名函数或变量,导致冲突。C++通过语法形式定义了全局无名命名空间,并允许对全局函数和变量进行作用域划分。命名空间支持嵌套与合并,便于协同开发。其使用需谨慎处理同名冲突。
|
7月前
|
存储 C++ 运维
开发与运维函数问题之使用C++标准库中的std::function来简化回调函数的使用如何解决
开发与运维函数问题之使用C++标准库中的std::function来简化回调函数的使用如何解决
69 6
|
7月前
|
C++ 运维
开发与运维编译问题之在C++中在使用std::mutex后能自动释放锁如何解决
开发与运维编译问题之在C++中在使用std::mutex后能自动释放锁如何解决
91 2
|
7月前
|
C++
C++一分钟之-类型别名与using声明
【7月更文挑战第20天】在C++中,类型别名和`using`声明提升代码清晰度与管理。类型别名简化复杂类型,如`using ComplexType = std::vector&lt;std::shared_ptr&lt;int&gt;&gt;;`,需注意命名清晰与适度使用。`using`声明引入命名空间成员,避免`using namespace std;`全局污染,宜局部与具体引入,如`using math::pi;`。恰当应用增强代码质量,规避常见陷阱。
110 5
|
8月前
|
安全 C++
C++一分钟之-字符串处理:std::string
【6月更文挑战第25天】`std::string`是C++文本处理的核心,存在于`&lt;string&gt;`库中。它支持初始化、访问、连接、查找、替换等操作。常见问题包括空指针解引用、越界访问和不当内存管理。要安全使用,确保字符串初始化,用`at()`检查边界,用`.empty()`检查空字符串,且无需手动释放内存。高效技巧包括预先分配内存、利用互转函数以及使用迭代器。记得正确比较和遍历字符串以保证代码效率和安全性。
111 5
|
8月前
|
存储 设计模式 安全
C++一分钟之-并发编程基础:线程与std::thread
【6月更文挑战第26天】C++11的`std::thread`简化了多线程编程,允许并发执行任务以提升效率。文中介绍了创建线程的基本方法,包括使用函数和lambda表达式,并强调了数据竞争、线程生命周期管理及异常安全等关键问题。通过示例展示了如何用互斥锁避免数据竞争,还提及了线程属性定制、线程局部存储和同步工具。理解并发编程的挑战与解决方案是提升程序性能的关键。
116 3
|
8月前
|
C++
C++一分钟之—名空间(namespace)的作用与使用
【6月更文挑战第22天】C++的命名空间是代码组织的关键,防止命名冲突并促进模块化。通过`namespace`定义代码块,如`MyNamespace{...}`,并使用别名(`namespace MN = MyNamespace::...`)简化引用。避免过度使用和嵌套,以及`using namespace`的滥用,而应在小范围内导入所需成员。明智选择名空间名称并有效利用`using`声明,能提升代码可读性和专业性。
254 1