当前位置:   article > 正文

C++初阶入门之命名空间和缺省参数的详细解析

C++初阶入门之命名空间和缺省参数的详细解析

个人主页点我进入主页

专栏分类:C语言初阶  C语言进阶  数据结构初阶    Linux    C++初阶    

欢迎大家点赞,评论,收藏。

一起努力,一起奔赴大厂

目录

一.前言

二.命名空间 

2.1命名冲突的例子

2.2解决方案

2.3命名空间的使用

2.3.1命名空间嵌套使用

2.3.2命名空间在结构体中的使用

2.3.3命名空间中函数的引用

2.3.4命名空间的展开

三.缺省参数

3.1缺省参数是什么

3.2缺省参数应用场景

四.总结


一.前言

        在前面我们学过C语言,在这里我们就要进入我们的C+ +环节,说到C++我们不得不说说的我们的C++祖师爷Bjarne Stroustrup,当我们学完C++后你不得不感叹祖师爷真的是祖师爷,他的思想是真的牛。在这篇文章中我们将涉及到命名空间,缺省参数,半缺省参数,其中的内容真的是非常的good。

二.命名空间 

2.1命名冲突的例子

        在一个很大的工程中,我们的代码是非常非常的多,甚至能达到几百万行,由于代码是很多人进行编写,就会造成我们的命名冲突,还记得c语言中我们有一个代码是

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

我们可以看到我们的变量x即是全局变量又是局部变量,我们的输出结果是0,说明程序是先检测局部变量,再检测全局变量,在我们的程序编写中命名冲突会带来很严重的影响,我们看下面代码:

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. int rand = 1;
  4. int main()
  5. {
  6. return 0;
  7. }

我们可以看到出现了报错

在我们的stdlib.h的文件中有一个函数的名字是rand,我们定义了一个全局变量是rand,因此发生了重定义的现象,还有一种我们的一个程序

一个人写的是

  1. struct SNode {
  2. int*a;
  3. int size;
  4. int capacity;
  5. };
  6. void Init(struct SNode*s)
  7. {
  8. //..
  9. }
  10. void Push(struct SNode* s)
  11. {
  12. }

另一个人写的是

  1. struct QNode {
  2. int val;
  3. struct QNode* next;
  4. };
  5. void Init(struct QNode* q)
  6. {
  7. }
  8. void Push(struct QNode* q)
  9. {
  10. }

我们可以看到他们的函数名字相同,从而引发了错误。

2.2解决方案

        在以上的集中问题中,祖师爷在设计c++中给出了完美的结局方案,那就是我们的命名空间,这个需要我们的关键字namespace,命名空间相当于一个带有门锁的房子,当这个门锁打开时它就是全局变量。例如下面的代码:

  1. #include<iostream>
  2. namespace bite1 {
  3. int x = 1;
  4. }
  5. namespace bite2
  6. {
  7. int x = 2;
  8. }
  9. int main()
  10. {
  11. std::cout << bite2::x << std::endl;
  12. std::cout << bite1::x << std::endl;
  13. return 0;
  14. }

我们的运行结果为

命名空间完美解决了命名冲突的问题。

2.3命名空间的使用

2.3.1命名空间嵌套使用

        在上面我们就是一个命名空间的使用,命名空间可还可以嵌套使用,例如下面:

  1. #include<iostream>
  2. namespace bite1 {
  3. int x = 1;
  4. namespace bite2
  5. {
  6. int x = 2;
  7. }
  8. }
  9. int main()
  10. {
  11. std::cout << bite1::bite2::x << std::endl;
  12. return 0;
  13. }

我们的运行结果为2.

2.3.2命名空间在结构体中的使用

  1. #include<iostream>
  2. namespace bite1 {
  3. struct SNode {
  4. int data;
  5. };
  6. }
  7. int main()
  8. {
  9. struct bite1::SNode s;
  10. s.data = 1;
  11. std::cout << s.data << std::endl;
  12. return 0;
  13. }

        我们的结构体在一个命名空间中,我们想定义一个接着结构体的变量,我们的定义方式不是先写命名空间的名字,需要我们先写struct,当然我们也可以写成bite1::SNode s,这是因为struct是类,至于类是什么可以看我后面的文章,我将会给大家进行详细解析。

2.3.3命名空间中函数的引用

  1. namespace bite {
  2. int Add(int x, int y)
  3. {
  4. return x + y;
  5. }
  6. }
  7. int main()
  8. {
  9. int ret = bite::Add(1, 2);
  10. std::cout << ret << std::endl;
  11. return 0;
  12. }

在使用函数时我们需要加上我们的命名空间域,当然我们的声明和定义分离时我们需要在命名空间的函数声明,在外面进行定义。

2.3.4命名空间的展开

        命名空间能全部展开,也能部分展开,在全部展开时我们们需要我们的using namespace 名字,对其进行展开,我们知道在寻找变量时是先找局部再找全局,由于namspace定义的既不是局部又不是全局,他是一个单独的,当我们加入这句话后就可以进行访问,它也就变成了全局,例如我们经常使用的using namespace std;就是将iostream文件中的std中的函数(cout,endl等)变更成全局的。例如下面的代码就是我们进行展开。

  1. #include"test.h"
  2. using namespace std;
  3. using namespace bite;
  4. int main()
  5. {
  6. int ret = Add(1, 2);
  7. cout << ret << endl;
  8. return 0;
  9. }

我们知道如果将这些全部展开相当于namespace就白白出现了,所以在我们的工作中我们通常是不会使用using namespace 名字的,但是我们有时候会经常使用一些,例如我们经常使用bite中的Add函数,但是我们却不想将bite中其他的进行放开,所以就出现了我们部分放开,

  1. #include"test.h"
  2. using bite::Add;
  3. int main()
  4. {
  5. int ret = Add(1, 2);
  6. std::cout << ret << std::endl;
  7. return 0;
  8. }

三.缺省参数

3.1缺省参数是什么

        缺省参数是C++一种特有的参数形式,遵循从右到左进行给值,声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参。(也就是说我们在定义函数时我们没有进行传参,这个函数也能正常编译,它的值是我们写函数是预设的值)。例如下面的代码:

  1. #include<iostream>
  2. int Add(int x = 1, int y = 2)
  3. {
  4. return x + y;
  5. }
  6. int main()
  7. {
  8. std::cout << Add(3, 3) << std::endl;
  9. std::cout << Add(3) << std::endl;
  10. std::cout << Add() << std::endl;
  11. return 0;
  12. }

我们运行后可以看到

所以我们知道了缺省参数当我们给值是,它正常运行,当我们不给值时它按照预定的值进行给值,我们需要注意我们打缺省参数定义的函数需要从右向左进行设定值,我们传参时需要从左向右进行传参,否则会出现错误。

3.2缺省参数应用场景

        在我们顺序表中,我们需要进行初始化和扩容,在那我们初始化为4,这是一个固定的数据,假如我们初始的数据为300,1000等这就会造成扩容多次,所以在那里我们就需要我们的半缺省参数,代码如下:

  1. #include<iostream>
  2. struct SNode {
  3. int* a;
  4. int size;
  5. int capacity;
  6. };
  7. void Init(SNode* s1, int x = 4)
  8. {
  9. s1->a = (int*)malloc (sizeof(int) * x);
  10. s1->size = 0;
  11. s1->capacity = x;
  12. }
  13. int main()
  14. {
  15. SNode s;
  16. Init(&s, 10);
  17. }

        我们通过修改我们的初始值的大小来改变我们初始的空间的大小,在这里缺省参数有很重要的作用,半层参数就是没有全部对参数进行赋值,上面这段代码就是半缺省参数,我们的s1没有进行赋值,半缺省参数我们一定要遵行从右向左进行赋值,从左向右给值。

四.总结

        我们需要知道命名空就相当于一个房子,只有这块房子才有访问的权限,我们只有通过using进行权限的打开就像Linux中的chmod进行权限的修改一样,命名空间在我们的以后工作中有非常重要的作用,其能极大程度上避免命名冲突的问题,我们的缺省参数也有非常重要的作用,希望大家可以认真学习一下,最后希望大家可以一键三连一下。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/42173
推荐阅读
相关标签
  

闽ICP备14008679号