• C++入门学习(1)命名空间和输入输出


    前言

            在C语言和基本的数据结构学习之后,我们终于迎来了期待已久的C++啦!C++发明出来的意义就是填补一些C语言的不足,让我们更加方便的写代码,所以今天我们就来讲一下C语言不足的地方和在C++中的解决办法!

    一、命名空间

            在学习命名空间这个概念之前,我们先来看下面这段代码:

    在这段代码中,我们定义了一个rand变量,但是我们还知道,rand又是stdlib这个头文件里面的函数名,理应来说应该会命名冲突的,但是我们不要忘了,这里的变量rand是局部变量,当命名冲突的时候,会优先调用局部变量,所以下面程序会正常打印4

            那什么情况下会命名冲突呢?我们接着往下看!

    1. #include
    2. #include
    3. int main()
    4. {
    5. int rand = 4;
    6. printf("%d\n",rand);
    7. return 0;
    8. }

            看这段代码,当我们把rand定义成全局变量的时候就会产生命名冲突了,这个程序无法正常执行下去了,那我们难道不可以自己来避免这个命名冲突的问题吗?就不用函数名就得了!可是大家想想,库里面很多函数,我们无法保证在未来写代码的时候,定义的变量名一定不跟函数名冲突,所以这个时候我们的命名空间这个概念就诞生了,那就让我们开始学习C++的第一课----命名空间吧!

    1. #include
    2. #include
    3. int rand = 4;
    4. int main()
    5. {
    6. printf("%d\n",rand);
    7. return 0;
    8. }

    二、命名空间的概念

    我们的命名空间,其实就是给我们定义的变量围上一堵墙,我们需要用的时候,就可以去调用这个命名空间,这跟我们C语言的结构体类似,就是把这些变量划分到命名空间里了,防止跟外面的产生命名冲突。也像给变量贴上个标签,告诉程序,这个是我的,不是函数名!

    三、命名空间的定义

    我们还需要知道在C++里面是可以写C的程序的,来一起看下面这段代码,命名空间的关键字就是namespace,后面再加上命名空间的名字,就是起个名字,随便起,推荐大家起名字的缩写,表明这里面的变量都是自己的,那我们定义完命名空间之后该如何调用呢?

    1. #include // C++里面的标准输入输出库
    2. #include // C的标准输入输出
    3. namespace xmb
    4. {
    5. int rand = 3;
    6. }
    7. int main()
    8. {
    9. printf("%d\n",xmb::rand);
    10. return 0;
    11. }

    四、 命名空间的内容

    命名空间里面可以放变量和函数体,结构体,联合体等数据类型,使用的时候就用上面的调用规则就可以了!

    1. #include
    2. namespace xmb
    3. {
    4. int rand = 12;
    5. int Add(int x, int y)
    6. {
    7. return x + y;
    8. }
    9. struct List
    10. {
    11. int a;
    12. int b;
    13. char c;
    14. };
    15. union room
    16. {
    17. int a;
    18. int b;
    19. char c;
    20. };
    21. }
    22. int main()
    23. {
    24. xmb::rand = 3;
    25. int num = xmb::Add(3,5);
    26. struct xmb::List la = {1,2,'a'};
    27. la.b = 3;
    28. la.c = 4;
    29. la.c = 'b';
    30. union xmb::room uroom = {3};
    31. uroom.a = 4;
    32. uroom.b = 3;
    33. uroom.c = 'a';
    34. return 0;
    35. }

    五、命名空间的嵌套

    我们的命名空间是可以嵌套的,我们可以嵌套多个命名空间,在调用的时候就依次来就可以。

    1. namespace xmb
    2. {
    3. int rand = 12;
    4. namespace xmb1
    5. {
    6. int Add(int x, int y)
    7. {
    8. return x + y;
    9. }
    10. namespace xmb11
    11. {
    12. int num = 10;
    13. }
    14. }
    15. namespace xmb2
    16. {
    17. struct List
    18. {
    19. int a;
    20. int b;
    21. char c;
    22. };
    23. }
    24. namespace xmb3
    25. {
    26. union room
    27. {
    28. int a;
    29. int b;
    30. char c;
    31. };
    32. }
    33. }
    34. int main()
    35. {
    36. xmb::xmb1::xmb11::num = 20;
    37. return 0;
    38. }

    六、命名空间在多文件中的应用

    既然命名空间如此的好用,那它在多文件中是否可以应用呢?

    答案是可以的,但是也有限制规则

    头文件:

    1. #include
    2. namespace xmb
    3. {
    4. typedef struct List
    5. {
    6. int* data;
    7. int size;
    8. int capacity;
    9. }SL;
    10. void SLInit(SL* phead);
    11. void SLPush(SL* phead,int num);
    12. }

    函数体:

    1. #include "test.h"
    2. namespace xmb
    3. {
    4. void SLInit(SL* phead)
    5. {
    6. phead->data = nullptr;
    7. phead->size = 0;
    8. phead->capacity = 0;
    9. }
    10. void SLPush(SL* phead,int num )
    11. {
    12. //
    13. }
    14. }

    我们在多文件的时候,命名空间一定要保持一致,

    同一个程序中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。

    比如上面的test.h和上面test.cpp中两个xmb会被合并成一个。

    七、命名空间的调用方式

    1. 命名空间名称 ➕ :: ➕ 变量名

    如图,我们需要调用rand这个变量,只需要如下的调用我们就可以使用了!再也不用担心会命名冲突了!

    注意!!!⚠️

    只要是跟库里面的函数名冲突了,就用这种方法,其他两种解决不了!

    1. #include // C++里面的标准输入输出库
    2. #include // C的标准输入输出
    3. namespace xmb
    4. {
    5. int rand = 3;
    6. }
    7. int main()
    8. {
    9. printf("%d\n",xmb::rand);
    10. return 0;
    11. }

    2. using➕命名空间名称➕::➕变量名

    1. #include // C++里面的标准输入输出库
    2. #include // C的标准输入输出
    3. namespace xmb
    4. {
    5. int a = 3;
    6. int b = 6;
    7. }
    8. using xmb::a;
    9. int main()
    10. {
    11. printf("%d\n",a);
    12. printf("%d\n",xmb::b);
    13. return 0;
    14. }

    3. using namespace ➕ 命名空间名称

    这个主要就是引入了命名空间,写完这个就可以直接调用命名空间里面的内容

    1. #include // C++里面的标准输入输出库
    2. #include // C的标准输入输出
    3. namespace xmb
    4. {
    5. int a = 3;
    6. int b = 6;
    7. }
    8. using namespace xmb;
    9. int main()
    10. {
    11. printf("%d\n",a);
    12. printf("%d\n",b);
    13. return 0;
    14. }

    八、C++中的输入输出

    大家在学习完命名空间之后,肯定会想,C++的输入输出还是跟C语言的一样吗?还是有自己更好的输入输出语句?

    答案是有更好的!接下来我们就介绍C++的输入输出!

    1. cout :类似C语言中的printf函数,是标准的输出到控制台/终端上,

    2. cin :类似C语言中的scanf函数,是标准的输入,从键盘上输入到变量。

    3. << :流插入运算符,配合cout使用

    4. >> :流提取运算符,配合cin使用

    5. endl :特殊的C++符号,表示换行输出

    我们的cout,cin和endl都在std这个命名空间里,而std命名空间在这个头文件里,所以我们要使用的时候必须同时调用std和它们两个。

    8.1 cout的使用

    这里就代表从右往左依次流入到cout(控制台/终端)上,先输出hello world 再输出换行

    1. #include
    2. using namespace std;
    3. int main()
    4. {
    5. cout << "hello world" << endl;
    6. return 0;
    7. }

    8.2 cin的使用

    cin这里就是从左往右依次输入,输入第一个值给a,空格或者换行,输入第二个值给b

    1. #include
    2. using namespace std;
    3. int main()
    4. {
    5. int a = 0;
    6. int b = 0;
    7. cin >> a >> b;
    8. cout<< a << endl << b << endl;
    9. return 0;
    10. }

    注意⚠️!!!

    使用C++输入输出更方便,不需要像printf/scanf输入输出时那样,需要手动控制格式。

    C++的输入输出可以自动识别变量类型

    1. #include
    2. using namespace std;
    3. int main()
    4. {
    5. int a = 0;
    6. double b = 0;
    7. char c = 0;
    8. cin >> a >> b >> c;
    9. cout<< a << endl << b << endl << c << endl;
    10. return 0;
    11. }

    九、std命名空间的使用惯例

    std是C++标准库的命名空间,如何展开std使用更合理呢?

    1. 在日常练习中,建议直接using namespace std即可,这样就很方便。

    1. #include
    2. using namespace std;
    3. int main()
    4. {
    5. int a = 0;
    6. double b = 0;
    7. char c = 0;
    8. cin >> a >> b >> c;
    9. cout<< a << endl << b << endl << c << endl;
    10. return 0;
    11. }

    2.但是 using namespace std 展开,标准库就全部暴露出来了,如果我们定义跟库重名的类型/对象/函数,就存在冲突问题。

    该问题在日常练习中很少出现,但是项目开发中代码较多、规模大,就很容易出现。

    所以我们不要展开全部,仅仅引用cou,cin和endl就可以了!

    1. #include
    2. using std::cout;
    3. using std::cin;
    4. using std::endl;
    5. int main()
    6. {
    7. int a = 0;
    8. double b = 0;
    9. char c = 0;
    10. cin >> a >> b >> c;
    11. cout<< a << endl << b << endl << c << endl;
    12. return 0;
    13. }
  • 相关阅读:
    循环结构——求素数个数和平均值
    在Vue里面使用v-for出现警告
    cad由于找不到mfc140u.dll怎么回事?mfc140u.dll丢失的解决方法
    CG-05 角度传感器工作介绍
    PyTorch 实战之水果分类
    Elasticsearch的倒排索引是什么?
    作业-11.11
    【100天精通Python】Day68:Python可视化_Matplotlib 绘制热力图,示例+代码
    一文详解贝叶斯优化(Bayesian Optimization)原理
    Vue Router完整的导航解析流程
  • 原文地址:https://blog.csdn.net/2302_76941579/article/details/134228935