c++中的using namespace std;

本文详细解释了C++中名称空间的概念及其用途,探讨了如何使用名称空间避免名称冲突,并介绍了using声明和编译指令的使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在使用<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)。或者使用解析运算符(::)。

### C++ 中 `using namespace std` 的意义 在 C++ 编程中,`using namespace std;` 是一条命名空间使用的声明语句。这条语句的作用是将标准库中的所有标识符引入到当前的命名空间中,从而允许程序员直接使用这些标识符而不必每次都加上前缀 `std::`[^1]。 例如,在不使用此命令的情况下,如果想要调用标准输入输出流对象 cout 或 cin,则需要写成如下形式: ```cpp #include <iostream> int main() { std::cout << "Hello, world!" << std::endl; return 0; } ``` 但是当加入了 `using namespace std;` 后就可以简化为更简洁的形式: ```cpp #include <iostream> using namespace std; int main() { cout << "Hello, world!" << endl; return 0; } ``` 这样做可以减少代码量并提高可读性,特别是在频繁访问同一命名空间内的多个成员时尤为明显[^2]。 然而需要注意的是,虽然这种方式可以使代码看起来更加整洁简单,但在大型项目或团队协作环境中可能会带来一些潜在的风险,比如名称冲突等问题。因此建议仅限于小型个人练习项目中采用这种做法,在正式开发过程中还是应该尽可能显式地指定完整的命名路径来避免不必要的麻烦。 ### 使用场景 对于初学者来说,在学习阶段为了方便理解编写简单的例子程序,适当使用 `using namespace std;` 可以帮助快速上手 C++ 编程。但对于实际工程项目而言,最好遵循良好的编码习惯,即只导入所需的特定部分而不是整个命名空间,这样既能保持代码清晰又能有效防止可能发生的重定义错误。 #### 示例:推荐的做法 相比于全局范围内的 `using namespace std;` ,局部范围内按需引入单个组件会更为安全可靠: ```cpp #include <iostream> // 局部作用域内使用 using 声明 void printMessage(const char* message) { using std::cout; using std::endl; cout << message << endl; } int main(){ printMessage("This is a safer way."); return 0; } ``` 通过上述方式可以在不影响其他地方的同时享受省略前缀带来的便利。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只大鸽子

如有帮助,欢迎关注同名公众号

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值