• C++入门(前言、命名空间、缺省参数、重载)


    该篇博客主要讲述关于C++发展前言,以及C++祖师爷对C进行改造提升后的新语法进行解释说明,具体内容为:发展历程、命名空间、输入\输出、缺省参数、函数的重载

    前言

    1.什么是C++

            在之前我们系统学习了C语言,对于C语言来说,它是一种面向过程结果化的语言,适合处理较小规模的程序。当我们面对复杂问题时,需要一种模块化、抽象化形式进行解决,为此,C++就由此而生,它是一种面向多像思想的编程语言。

    2.C++的发展史

            对于C++的发展而言,我们可以看如下:

            

    阶段内容
    C with
    classes
    类及派生类、公有和私有成员、类的构造和析构、友元、内联函数、赋值运算符
    重载等
    C++1.0添加虚函数概念,函数和运算符重载,引用、常量等
    C++2.0更加完善支持面向对象,新增保护成员、多重继承、对象的初始化、抽象类、静
    态成员以及const成员函数
    C++3.0进一步完善,引入模板,解决多重继承产生的二义性问题和相应构造和析构的处
    C++98C++标准第一个版本,绝大多数编译器都支持,得到了国际标准化组织(ISO)和美
    国标准化协会认可,以模板方式重写C++标准库,引入了STL(标准模板库)
    C++03C++标准第二个版本,语言特性无大改变,主要:修订错误、减少多异性
    C++05C++标准委员会发布了一份计数报告(Technical Report,TR1),正式更名
    C++0x,即:计划在本世纪第一个10年的某个时间发布
    C++11增加了许多特性,使得C++更像一种新语言,比如:正则表达式、基于范围for循
    环、auto关键字、新容器、列表初始化、标准线程库等
    C++14对C++11的扩展,主要是修复C++11中漏洞以及改进,比如:泛型的lambda表
    达式,auto的返回值类型推导,二进制字面常量等
    C++17在C++11上做了一些小幅改进,增加了19个新特性,比如:static_assert()的文
    本信息可选,Fold表达式用于可变的模板,if和switch语句中的初始化器等
    C++20自C++11以来最大的发行版,引入了许多新的特性,比如:模块(Modules)、协
    程(Coroutines)、范围(Ranges)、概念(Constraints)等重大特性,还有对已有
    特性的更新:比如Lambda支持模板、范围for支持初始化等
    C++23制定ing

            我们主要关注C++98和C++11两个发行版本,因为现在公司主流还是以这两个版本为标准。

    3.关于C++的学习

    1. 多总结知识点,博客不能停,每学一节课,均需要写对应的博客进行记录
    2. 中后期画思维导图进行总结(可用XMind)
    3. 看C++书籍,前期可看《C++程序设计》这本书,用于入门;中期看《Effective C++》《C++ Primer》,必看的两本书;后期可看《STL源码剖析》,注意这本书需要一定基础
    4. 勤刷题

            在C语言中存在许多不足的地方,因此祖师爷对这些地方提出了解决办法,给出了一系列更加利于编程的语法,下面我将开始介绍。

    一、关于命名空间

    1.含义

            在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。

            列如看以下示例:

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

          程序报错:

         

            其原因是rand为stdlib.h这个头文件里的一个方法,当我们定义Int rand为变量时,编译时,编译器会进行全局搜索,同时找到了stdlib.h里的rand以及我们定义的rand,这就造成了重定义了,这在c语言中时不允许的。

            除了这种情况外,当我们面临命名冲突或多人进行项目时,也会形成命名冲突问题,简单来说,命名空间就是防止命名冲突。

    2.定义

            命名空间关键字为namespace,基本格式为:namespace+命名空间名字+{成员}。命名空间有以下三种情况:

    1. //命名空间里成员可以为变量、函数、类型(结构体)
    2. //1.正常的命名空间
    3. namespace lmx{
    4. int rand = 1;
    5. int Add(int i, int j)
    6. {
    7. return i + j;
    8. }
    9. struct open
    10. {
    11. int k;
    12. };
    13. }
    14. //2.嵌套命名空间
    15. namespace oo {
    16. int rand = 1;
    17. namespace kk {
    18. }
    19. }
    20. //3.同一个工程中,命名空间名相同会自动合并为一个命名空间
    21. //以下命名空间会和第一个命名空间合并为一个。
    22. namespace lmx {
    23. int j = 1;
    24. }

            注意:一个命名空间就相当于一个作用域,其成员也属于该作用域内,如遇到情况3的合并命名空间中发现有相同的成员,这也会导致命名冲突问题。

    4.使用

            符号介绍::: 该符号称为作用限定符。

            当我们需要访问命名空间的成员时,需要用作用限定符:

    1. int main()
    2. {
    3. printf("%b\n", lmx::rand);
    4. return 0;
    5. }

            但在现实开发中,这种方式比较麻烦,以下有两种方式可以不加作用限定符:

    1.使用using将命名空间中某个成员引入(简称部分展开)

            用于我们需要经常使用该成员,这种方式经常使用。

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

      

    2.使用using namespace 命名空间名称 引入(简称全部展开)

            命名空间内的成员都可以访问,不需要加作用限定符,但这种方式不可取,全部展开后相当于没有命名空间,容易造成命名冲突问题。

    1. using namespace lmx;
    2. int main()
    3. {
    4. printf("%d\n", rand);
    5. return 0;
    6. }

    二、C++输入&输出

            在C++中对于输入\输出有固定的符号,分别为<<(流插入)和>>(流提取)。

            这里不过多介绍,我们只需知道在c++中输入\输出有以下特性:

            

    1. //iostream头文件是c++中输入输出流文件
    2. #include
    3. // std是C++标准库的命名空间名,C++将标准库的定义实现都放到这个命名空间中
    4. using namespace std;
    5. int main()
    6. {
    7. int k = 0;
    8. //输入流-->相当于c语言中printf
    9. cout << "Hello world!!!" << endl;
    10. //输出流-->相当于c语言中scanf
    11. cin >> k;
    12. //特性:自动识别类型,不需要控制格式
    13. int j = 2;
    14. double k = 2.2;
    15. cin >> j;
    16. cin >> k;
    17. cout << "j=" << j << endl;
    18. cout << "k=" << k << endl;
    19. return 0;
    20. }

            在日常练习中我们经常将名为std的命名空间全部展开,方便我们编写代码,但在实际开发中不可取,容易造成命名冲突。

    三、缺省参数

    1.缺省参数概念

            缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参。具体看以下例子:

    1. //全缺省参数(参数全有值)
    2. void Add(int k=1, int j = 1)
    3. {
    4. printf("%d", k + j);
    5. }
    6. //半缺省参数(部分参数有值)
    7. void sub(int k, int j = 1)
    8. {
    9. printf("%d", k/j);
    10. }

            注意:1.半缺省参数必须从右往左依次来给出,不能间隔着给,如以下情况:

    1. void Add(int k=1,int a, int j = 1)
    2. {
    3. printf("%d", k + j+ a);
    4. }

                      2.缺省参数不能在函数声明和定义中同时出现,如以下情况:

    1.  //a.h
    2.  void Func(int a = 10);
    3.  // a.cpp
    4.  void Func(int a = 20)
    5. {}
    6.  // 注意:如果生命与定义位置同时出现,恰巧两个位置提供的值不同,那编译器就无法确定到底该
    7. 用那个缺省值

            对应这种情况,应为函数声明缺省,函数定义不缺省。

    1. void Func(int a = 0)
    2. {
    3. cout<
    4. }
    5. int main()
    6. {
    7. Func();   // 没有传参时,使用参数的默认值
    8. Func(10);  // 传参时,使用指定的实参
    9. return 0;
    10. }

            3.缺省值必须是常量或者全局变量


    五、函数重载

    1.函数重载概念

            函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同,常用来处理实现功能类似数据类型
    不同的问题。

            简单来说就是函数的返回类型和函数名必须相同,参数不同。

            具体有以下三种类型:

            

    1. #include
    2. using namespace std;
    3. // 1、参数类型不同
    4. int Add(int left, int right)
    5. {
    6. cout << "int Add(int left, int right)" << endl;
    7. return left + right;
    8. }
    9. double Add(double left, double right)
    10. {
    11. cout << "double Add(double left, double right)" << endl;
    12. return left + right;
    13. }
    14. // 2、参数个数不同
    15. void f()
    16. {
    17. cout << "f()" << endl;
    18. }
    19. void f(int a)
    20. {
    21. cont << "f(int a)" << endl;
    22. }
    23. // 3、参数类型顺序不同
    24. void f(int a, char b)
    25. {
    26. cout << "f(int a,char b)" << endl;
    27. }
    28. void f(char b, int a)
    29. {
    30. cout << "f(char b, int a)" << endl;
    31. }
    32. int main()
    33. {
    34. Add(10, 20);
    35. Add(10.1, 20.2);
    36. f();
    37. f(10);
    38. f(10, 'a');
    39. f('a', 10);
    40. return 0;
    41. }

  • 相关阅读:
    Tomcat10的坑
    图解DockerRegistry与CharMuseum
    梯度引导的分子生成扩散模型- GaUDI 评测
    名单揭晓 | 2021年度中国杰出知识产权服务团队
    Go开始:Go基本元素介绍
    Java spring boot常用注解
    HarmonyOS【ArkUI组件--TextInput】
    入职字节外包一个月,我离职了
    《JAVA程序设计》教学上机实验报告
    Python Appium 安卓自动化测试 基本使用 - Phone Spider
  • 原文地址:https://blog.csdn.net/m0_74088266/article/details/133323867