• 【C++】从认识using namespace std开始进入C++的学习


    👀樊梓慕:个人主页

     🎥个人专栏:《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C++》

    🌝每一个不曾起舞的日子,都是对生命的辜负


    📣📣📣今天博主就正式开始学习C++啦,感谢大家在C语言阶段的一路陪伴📣📣📣

    🌠编程之路刚刚开始🌠

    🚨革命尚未成功,同志仍需努力🚨


    目录

    前言

    1.命名空间

    2.怎样使用命名空间

    3.using namespace std的作用

    4.什么场景下适合展开标准库命名空间

    5.std命名空间的使用惯例


    前言

    很多人在刚刚开始学习C++的时候,老师一般会让大家直接加上这样一段代码:

    using namespace std;

     可究竟为什么要加上这段代码??

    也许你的老师并没有展开细讲

    那么今天,博主就会从这一最初的疑惑开始,与大家一起进入C++的学习。


    欢迎大家📂收藏📂以便未来做题时可以快速找到思路,巧妙的方法可以事半功倍。

    =========================================================================

    GITEE相关代码:🌟fanfei_c的仓库🌟

    =========================================================================


    1.命名空间namespace

    学习到现在的阶段,大部分人可能还没有接触甚至没有见过比较大型的项目。

    在一些大型项目中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。

    通俗的讲,就是重名。

    C++之父·本贾尼在设计C++语言时就发现了这一问题,命名空间就是他提出的解决方案。

    namespace顾名思义就是命名空间,在C++中namespace是一个关键字,就像整型int,字符型char一样。

    也就是说,本贾尼为了避免命名冲突或名字污染等问题,专门写了一个关键字namespace,将变量、函数和类的名称可以放在一个空间里,从而就解决了重名的问题。


    🔎那么我们接下来就来看一看命名空间是如何使用的🔍


    2.怎样使用命名空间

    首先命名空间中可以定义变量/函数/类型,比如

    1. namespace f1
    2. {
    3. //变量
    4. int rand = 10;
    5. //函数
    6. int Add(int left, int right)
    7. {
    8. return left + right;
    9. }
    10. //类型
    11. struct Node
    12. {
    13. struct Node* next;
    14. int val;
    15. };
    16. }

     其次命名空间可以嵌套,比如

    1. namespace f1
    2. {
    3. int a;
    4. int b;
    5. int Add(int left, int right)
    6. {
    7. return left + right;
    8. }
    9. //嵌套
    10. namespace f2
    11. {
    12. int c;
    13. int d;
    14. int Sub(int left, int right)
    15. {
    16. return left - right;
    17. }
    18. }
    19. }

    在同一工程中,如果存在多个相同名称的命名空间,程序在执行时,会将他们合并,比如

    1. // test.h
    2. namespace f1
    3. {
    4. int Mul(int left, int right)
    5. {
    6. return left * right;
    7. }
    8. }
    9. // test.c
    10. namespace f1
    11. {
    12. int a;
    13. int b;
    14. int Add(int left, int right)
    15. {
    16. return left + right;
    17. }
    18. namespace f2
    19. {
    20. int c;
    21. int d;
    22. int Sub(int left, int right)
    23. {
    24. return left - right;
    25. }
    26. }
    27. }

    注意:大家可以将命名空间理解为作用域,一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中。


    如何使用命名空间中的变量、函数和类型呢


    有三种方式可以使用命名空间中的内容:

    (1)加命名空间名称作用域限定符::

    1. int main()
    2. {
    3. printf("%d\n", N::a);
    4. return 0;
    5. }

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

    1. using N::b;
    2. int main()
    3. {
    4. printf("%d\n", N::a);
    5. printf("%d\n", b);
    6. return 0;
    7. }

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

    1. using namespce F;
    2. int main()
    3. {
    4. printf("%d\n", F::a);
    5. printf("%d\n", b);
    6. Add(10, 20);
    7. return 0;
    8. }

    3.using namespace std的作用

    了解了上面的内容,using与namespace你就都应该了解了。

    现在的问题就剩下std是什么了。

    std是C++标准库的命名空间名,C++将标准库的定义实现都放到这个命名空间中。

    也就是说,using namespace std就是上面讲解命名空间的使用中的第三个方式罢了。

     我们可以理解为展开,将该命名空间展开,使该命名空间中的变量、函数和类型名称暴露出来。

    using namespace std的意思就是将C++标准库展开,让我们可以使用里面的各种变量、函数和类型。


    4.什么场景下适合展开标准库命名空间

    你一定想到了,展开命名空间是一件很不安全的做法,因为本贾尼起初设计命名空间的本意就是为了让命名空间内部的变量、函数和类型名称不冲突或不被污染。

     那么如何展开std从而让使用更加合理呢?

    1. 在日常练习中,建议直接using namespace std即可,这样很方便。
    2. using namespace std展开,标准库就全部暴露出来了,如果我们定义跟库重名的类型/对象/函数,就存在冲突问题。该问题在日常练习中很少出现,但是项目开发中代码较多、规模大,就很容易出现。所以建议在项目开发中使用,像std::cout这样使用时指定命名空间 + using std::cout展开常用的库对象/类型等方式。

    🔑🔑​​​​​​​🔑​​​​​​​那么看到这里,你的疑惑是否被解答了呢🔑🔑🔑

    🌝如果有任何问题,欢迎在评论区提出,博主看到一定会认真回复的🌝


    =========================================================================

    如果你对该系列文章有兴趣的话,欢迎持续关注博主动态,博主会持续输出优质内容

    🍎博主很需要大家的支持,你的支持是我创作的不竭动力🍎

    🌟~ 点赞收藏+关注 ~🌟

    ========================================================================= 

  • 相关阅读:
    【实战】 七、Hook,路由,与 URL 状态管理(下) —— React17+React Hook+TS4 最佳实践,仿 Jira 企业级项目(十三)
    J9数字论:热存储与冷存储:哪个最安全?
    AI推介-多模态视觉语言模型VLMs论文速览(arXiv方向):2024.03.01-2024.03.05
    Stateflow状态转移练习
    【C/C++笔试练习】常见进制转换、宏的定义和特点、sizeof与strlen、字符串函数、统计回文、连续最大和
    什么是系统架构师?什么是系统架构?
    CentOS 7安装Redis5.0.7
    常见的设计模式
    25-SpringBoot 自定义starter
    C++:封装,继承
  • 原文地址:https://blog.csdn.net/2301_77112634/article/details/133794286