using namespace std

article/2025/10/6 16:31:30

整体认识 —— 解决命名冲突

一个简单的C++程序:

#include<iostream>using namespace std;int main(int argc,char **argv)
{cout<<"hello world !"<<endl;system("pause");    // 让程序暂停,按任意键继续 注意,这行不是标准的C++代码, 仅限于调试使用 cout<<"出来了"<<endl;return 0;
}

其中:

using namespace std;

是什么意思,又有什么作用呢?

“using namespace std;”,顾名思义 —— 使用(using)名空间(namespace)std,std是名空间的名字,这是C++为了解决不同工程的变量,函数等命名冲突的问题,引入的名空间(namespace)的概念,相当于文件夹的目录和子文件的关系——不同的目录(namespce)下即使有相同子文件名(变量,函数等)也不会产生冲突(如果接触过Java,这里类似于Java中不同的包的作用)。下面是个小例子:

// 声明名空间Jack
namespace Jack {double height;void fetch();
}
// 声明名空间Jill
namespace Jill {double height;void fetch();
}
// 使用名空间
cout<<Jack::height<<endl;
cout<<Jill::height<<endl;
Jack::fetch();

可以看到,可以指定特定名空间下的同名变量(height)和函数(fetch())。

有时名空间内的内容太多,使用限定符::就太过繁琐,可以使用"using namespace XXX;"直接引入整个名空间:

namespace Jack {double height;void fetch();...
}int main(int argc,char **argv)
{// 这句之后的代码,如果出现Jack中的变量,函数等,均视为Jack中的// 类似于局部变量覆盖整体变量的效果using namespace Jack;   height= 176.34;fetch();
}

使用方式

注意两种用法的区别:

限定符方式: Jack::height;

using编译方式:using namespace Jack;

前者可以看做只引用名空间Jack中的一个变量——height,后者是编译整个名空间Jack。

显然,表面来看,”using namespace Jack;“无脑又方便,那为什么还要用限定符呢?

这是因为”using namespace Jack;“会编译整个名空间并引入到当前程序中,如果本地有变量方法和类名如果和其冲突,则本地会覆盖原名空间的内容,看下面的例子:

#include<iostream>using namespace std; namespace Senario
{class Student{int age;string name;string sex;Student(){age = 20;name = "Martin";sex = "male";}};
}    // namespace Senario的作用域到此结束// 注意这里是在当前名空间内声明的Studentclass Student{int age;string name;Student(){age = 18;name = "Kevin";}};int main(int argcs,char** args)
{using namespace Senario;// 此时这个Student就会被“局部变量”————当前名空间内Student覆盖掉Student student = new Student();   cout<<student.name<<endl;cout<<student.sex<<endl;return 0;
}

程序编译结果:

好吧,经实验,直接报错:

[Error] reference to 'Student' is ambiguous

①处说的很清楚,Student是不明确的,②处给出了更详细的信息:Student有两个选择:class Student(当前名空间内)和Senario:: Student两个选择。

总结

现在回到原来的问题:

using namespace std;

其实已经很清晰,std是CPP标准库所在的名空间的名称,"using namespace std;"的作用——引入并编译了标准库中所有的内容,其中最重要的莫过于cin,cout,endl,string。

使用using编译指令固然方便,但是就像上面描述的问题一样,若程序中程序员自己定义的变量,方法,类等名称和std中冲突(这种情况下程序员大概率还不知道(std库太大,其中内容太多)),编译时就会报错。

所以”using namespace std;“虽然最常使用,但是也要注意:保证本地名空间和引入的其他名空间没有std相同的变量方法名(当然,在程序中没有调用的变量方法不影响)。

所以,总结一下:

最保险:

int main(int argcs,char** args)
{
int x;
std::cin >> x;
std::cout << x << std::endl;
}

偷懒但有隐患:

using namespace std;
int main(int argcs,char** args)
{
int x;
cin >> x;
cout << x << endl;
}

为避免冲突和提高效率(次要):

using std::cin;
using std::cout;
using std::endl;
int main(int argcs,char** args)
{
int x;
cin >> x;
cout << x << endl;
}

局部代码块中使用,引入名空间而不是头部引入:


int main(int argcs,char** args)
{{
using namespace std;
int x;
cin >> x;
cout << x << endl;
}...          //其他不需要用到std的代码}

对于这种方式,可以像上面写的一样,使用花括号限定名空间作用域。

但这仅限于个别调用的场景,像cin,cout,endl,string基本散布在代码各个地方,这种方法就不行了,不过cin,cout,endl,string这样如此”常见“的标识符,甚至是个写C++的都知道,本地代码的命名应该不会与此发生冲突,故对于只使用std中cin,cout,endl,string的场景,使用using namespace std这种方式是安全且方便的。

当然,最保险的方式还是:

using std::cin;
using std::cout;
using std::endl;
using std::string;

另外,明白名空间的作用以后,可以将特定变量放在名空间中,如C++不提倡使用类似于static int counter这种来计数,那么可以将计数器放在特定的名空间中,每次访问加上名空间和作用符即可,这样既起到全局变量的效果,又不至于破坏程序的独立性和模块化。

喜欢的别忘了点个赞哦

参考资料:

https://www.jianshu.com/p/16141adf0229

https://www.jb51.net/article/129644.htm

声明:除已注明的引用外,文章系作者原创,引用转载请注明出处,如有必要请联系作者。


http://chatgpt.dhexx.cn/article/0BIOjMGx.shtml

相关文章

K8S:Namespace详解

Namespace概念 Kubernetes 支持多个虚拟集群&#xff0c;它们底层依赖于同一个物理集群&#xff0c;这些虚拟集群被称为命名空间。 命名空间 namespace 是 k8s 集群级别的资源&#xff0c;可以给不同的用户、租户、环境或项目创建对应的命名空间。 在创建pod的时候可以指定p…

TypeScript中的命名空间—namespace

TypeScript中的命名空间—namespace 什么是命名空间&#xff1f;在很多语言中都有这个概念。 命名空间是为了解决命名冲突。比如你在代码的不同地方&#xff0c;都定义了同名但是不同含义的函数、变量等&#xff0c;虽然不提倡这么做&#xff0c;但是有时候需要这么做。那怎么…

c++ 中的 namespace 用法

多人代码的整合&#xff0c;namespace 还是非常有用的。可以很轻松的避免变量与函数一样的命名 1. namespace 在 单个头文件 中使用 下面给一个简单示例演示命名空间和自定义头文件的使用&#xff0c;代码如下&#xff1a; compare.h&#xff1a; namespace compare{double…

【C++】命名空间(namespace) 以及理解using namespace std

命名空间 1.命名空间使用的背景1.背景 2.命名空间的定义&#xff08;namespace&#xff09;2.1正常的定义2.2 命名空间可以嵌套定义2.3允许命名空间相同 3.域作用限定符&#xff08;&#xff1a;&#xff1a;&#xff09;和命名空间的使用3.1域作用限定符&#xff08;&#xff…

C++ namespace

C namespace 一、什么是 namespace1.1 C语言标识符作用域的缺陷1.2 namespace作用 二、namespace的定义2.1 命名空间可以嵌套定义小技巧 2.2 可定义重复的命名空间 三、namespace使用3.1 命名空间名称作用域限定符使用3.2 using将命名空间中成员引入3.3 使用using namespace将整…

Linux namespace概述

操作系统通过虚拟内存技术&#xff0c;使得每个用户进程都认为自己拥有所有的物理内存&#xff0c;这是操作系统对内存的虚拟化。操作系统通过分时调度系统&#xff0c;每个进程都能被【公平地】调度执行&#xff0c;即每个进程都能获取到CPU&#xff0c;使得每个进程都认为自己…

C++ | 你真的了解namespace吗?

文章目录 一、前言二、命名冲突三、命名空间1、域作用限定符2、命名空间的概念&#x1f449;示例1&#x1f449;示例2 3、命名空间的定义4、命名空间的使用① 指定命名空间访问【做项目】② 使用using部分展开【做项目】③ 使用using namespace全局展开【日常练习】 5、小结 解…

using namespace std 介绍

using namespace std&#xff1b; 首先我们要知道&#xff0c;这句代码的意思是&#xff1a;打开标准命名空间&#xff0c;即告诉编辑器我们将要使用名字空间std中的函数或者对象。 using 意思就是正在使用的意思。namespace 的引用是为了解决不同space中命名相同导致命名冲突…

Namespace基本知识

published: true tags: C author: persuez Namespace C中namespace简单来说就是用来控制标志符&#xff08;如变量&#xff0c;函数&#xff0c;类等&#xff09;的名字冲突的。 简单术语 declarative region: 指标志符声明的区域。具体见图一。 potential scope: 指从该标…

【C++】命名空间namespace详解

一、命名空间的引入 C中&#xff0c;名称(name)可以是符号常量、变量、宏、函数、结构体、枚举、类和对象等等。而在大型工程中&#xff0c;难免会有重名的现象&#xff0c;命名空间namespace&#xff0c;就是C引入的一种解决名称冲突的机制 1.1 如何解决命名冲突 C语言中 …

namespace介绍

命名空间 命名空间 namespace 1、::作用域运算符&#xff08;表明 数据、方法 的归属性问题&#xff09; 2、命名空间 namespace 解决命名冲突 2.1&#xff1a;namespace命名空间的定义 2.2:命名空间只能全局范围内定义&#xff08;以下错误写法&#xff09; 2.3:命名空间可嵌套…

【C++】命名空间(namespace)详解

一、为什么使用命名空间 考虑一种情况&#xff0c;当我们有两个同名的人&#xff0c;Zara&#xff0c;在同一个班里。当我们需要对它们进行区分我们必须使用一些额外的信息和它们的名字&#xff0c;比如这个区域&#xff0c;如果它们生活在不同的区域或者它们的母亲或父亲的名…

Python中,线程threading详解

Python中最常用的同步有&#xff1a;锁/互斥&#xff0c;以及信号量。其中锁是最简单最低级的机制&#xff0c;信号量用于多线程竞争有限资源的情况。但是锁被释放&#xff0c;线程不一定被释放。 threading.Lock同步锁&#xff08;原语锁&#xff09; 通常使用获得锁&#xff…

【Python】多线程及threading模块介绍

​目录 1. 多线程简单介绍 2. threading模块介绍 2.1 threading模块常用方法 2.2 Thread类使用 2.2.1 使用构造函数传递可调用对象的方法创建线程 2.2.2 继承threading.Thread类 3. 多线程程序中使用(共享)全局变量 4. 多线程共享全局变量遇到的问题 5. 线程同步 5.1 …

threading库:Python线程的基础知识

目录 前言Thread对象区分线程守护线程自定义线程定时器线程线程间传送信号 前言 前面的subprocess库主要讲解的是进程知识与进程间的交互。而进程有可以拥有多个线程&#xff0c;所以threading库提供了管理多个线程执行的API&#xff0c;允许程序在同一个进程空间并发地运行多…

Python Threading 线程模块用法

一、什么是 Threading Threading用于提供线程相关的操作&#xff0c;线程是应用程序中工作的最小单元。python当前版本的多线程库没有实现优先级、线程组&#xff0c;线程也不能被停止、暂停、恢复、中断。 1.1、线程池图解 二、创建线程 导入模块threading&#xff0c;通过…

python中threading模块_python中threading模块详解

python中threading模块详解,threading提供了一个比thread模块更高层的API来提供线程的并发性。这些线程并发运行并共享内存。 下面来看threading模块的具体用法: 一、Thread的使用 目标函数可以实例化一个Thread对象,每个Thread对象代表着一个线程,可以通过start()方法,开…

python中的threading_python中threading的用法

threading提供了一个比thread模块更高层的API来提供线程的并发性。这些线程并发运行并共享内存。 下面来看threading模块的具体用法&#xff1a; 一、Thread的使用 目标函数可以实例化一个Thread对象&#xff0c;每个Thread对象代表着一个线程&#xff0c;可以通过start()方法…

Python--threading多线程总结

转载自&#xff1a;https://www.cnblogs.com/tkqasn/p/5700281.html threading用于提供线程相关的操作&#xff0c;线程是应用程序中工作的最小单元。python当前版本的多线程库没有实现优先级、线程组&#xff0c;线程也不能被停止、暂停、恢复、中断。 threading模块提供的类&…

Python 批量创建线程及threading.Thread类的常用函数及方法

在《【Python】线程的创建、执行、互斥、同步、销毁》&#xff08;点击打开链接&#xff09;中介绍了Python中线程的使用&#xff0c;但是里面线程的创建&#xff0c;使用了很原始的方式&#xff0c;一行代码创建一条。其实&#xff0c;Python里是可以批量创建线程的。利用Pyth…