前言
很多人在刚刚开始学习C++的时候,老师一般会让大家直接加上这样一段代码:
using namespace std;
可究竟为什么要加上这段代码??
也许你的老师并没有展开细讲。
那么今天,博主就会从这一最初的疑惑开始,与大家一起进入C++的学习。
欢迎大家📂收藏📂以便未来做题时可以快速找到思路,巧妙的方法可以事半功倍。
=========================================================================
GITEE相关代码:🌟fanfei_c的仓库🌟
=========================================================================
1.命名空间namespace
学习到现在的阶段,大部分人可能还没有接触甚至没有见过比较大型的项目。
在一些大型项目中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。
通俗的讲,就是重名。
C++之父·本贾尼在设计C++语言时就发现了这一问题,命名空间就是他提出的解决方案。
namespace顾名思义就是命名空间,在C++中namespace是一个关键字,就像整型int,字符型char一样。
也就是说,本贾尼为了避免命名冲突或名字污染等问题,专门写了一个关键字namespace,将变量、函数和类的名称可以放在一个空间里,从而就解决了重名的问题。
🔎那么我们接下来就来看一看命名空间是如何使用的🔍
2.怎样使用命名空间
首先命名空间中可以定义变量/函数/类型,比如
namespace f1 { //变量 int rand = 10; //函数 int Add(int left, int right) { return left + right; } //类型 struct Node { struct Node* next; int val; }; }
其次命名空间可以嵌套,比如
namespace f1 { int a; int b; int Add(int left, int right) { return left + right; } //嵌套 namespace f2 { int c; int d; int Sub(int left, int right) { return left - right; } } }
在同一工程中,如果存在多个相同名称的命名空间,程序在执行时,会将他们合并,比如
// test.h namespace f1 { int Mul(int left, int right) { return left * right; } } // test.c namespace f1 { int a; int b; int Add(int left, int right) { return left + right; } namespace f2 { int c; int d; int Sub(int left, int right) { return left - right; } } }
注意:大家可以将命名空间理解为作用域,一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中。
❓如何使用命名空间中的变量、函数和类型呢❓
有三种方式可以使用命名空间中的内容:
(1)加命名空间名称及作用域限定符::
int main() { printf("%d\n", N::a); return 0; }
(2)使用using将命名空间中某个成员引入
using N::b; int main() { printf("%d\n", N::a); printf("%d\n", b); return 0; }
(3)使用using namespace 命名空间名称 引入
using namespce F; int main() { printf("%d\n", F::a); printf("%d\n", b); Add(10, 20); return 0; }
3.using namespace std的作用
了解了上面的内容,using与namespace你就都应该了解了。
现在的问题就剩下std是什么了。
std是C++标准库的命名空间名,C++将标准库的定义实现都放到这个命名空间中。
也就是说,using namespace std就是上面讲解命名空间的使用中的第三个方式罢了。
我们可以理解为展开,将该命名空间展开,使该命名空间中的变量、函数和类型名称暴露出来。
using namespace std的意思就是将C++标准库展开,让我们可以使用里面的各种变量、函数和类型。
4.什么场景下适合展开标准库命名空间
你一定想到了,展开命名空间是一件很不安全的做法,因为本贾尼起初设计命名空间的本意就是为了让命名空间内部的变量、函数和类型名称不冲突或不被污染。
那么如何展开std从而让使用更加合理呢?
- 在日常练习中,建议直接using namespace std即可,这样很方便。
- using namespace std展开,标准库就全部暴露出来了,如果我们定义跟库重名的类型/对象/函数,就存在冲突问题。该问题在日常练习中很少出现,但是项目开发中代码较多、规模大,就很容易出现。所以建议在项目开发中使用,像std::cout这样使用时指定命名空间 + using std::cout展开常用的库对象/类型等方式。
🔑🔑🔑那么看到这里,你的疑惑是否被解答了呢🔑🔑🔑
🌝如果有任何问题,欢迎在评论区提出,博主看到一定会认真回复的🌝
=========================================================================
如果你对该系列文章有兴趣的话,欢迎持续关注博主动态,博主会持续输出优质内容
🍎博主很需要大家的支持,你的支持是我创作的不竭动力🍎
🌟~ 点赞收藏+关注 ~🌟
=========================================================================