【C++初阶】一、入门知识讲解(C++关键字、命名空间、C++输入&输出、缺省参数、函数重载)

03-02 1075阅读

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

相关代码gitee自取:

C语言学习日记: 加油努力 (gitee.com)

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

接上期:

【数据结构初阶】十一、归并排序(比较排序)的讲解和实现

(递归版本 + 非递归版本 -- C语言实现)-CSDN博客

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

                     

引言:什么是C++

  • C语言是结构化和模块化的语言,适合处理较小规模的程序。
    对于复杂的问题,规模较大的程序,需要高度的抽象和建模时,C语言就不合适了。

    为了解决软件危机,20世纪80年代,计算机界提出了:
    OOP(object oriented programming:面向对象)思想,
    支持面向对象的程序设计语言应运而生

                             

  • 1982年,Bjarne Stroustrup博士在C语言的基础上引入并扩充了面向对象的概念,
    发明了一种新的程序语言,为了表达该语言与C语言的渊源关系,命名为C++

                             

  • 因此:C++是基于C语言而产生的,

    它即可以进行C语言的过程化程序设计,
    又可以进行以抽象数据类型为特点的基于对象的程序设计,
    还可以进行面向对象的程序设计

                      

  • C++是在C语言的基础之上,容纳了面向对象编程思想,

    并增加了许多有用的库,以及编程范式等。

    熟悉C语言的话,对C++的学习有一定的帮助

                    

  • 本篇博客主要目标:

    1、补充C语言语法的不足,以及C++是如何对C语言设计不合理的地方进行优化的,

    如:作用域方面、IO方面、函数方面、指针方面、宏方面等

    2、为后续了解类和对象打下基础

               

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

                 

    引言:C++的发展史

    1979年,贝尔实验室的本贾尼等人试图分析unix内核的时候,
    试图将内核模块化,于是在C语言的基础上进行扩展,增加了类的机制,
    完成了一个可以运行的预处理程序,称之为 C with classes

                        

    C++语言也进行着逐步递进、由浅入深的过程

    C++的历史版本:
    阶段内容
    C with classes

    类及派生类、公有和私有成员、类的构造和析构、友元、内联函数、赋值运算符

    重载等

    C++1.0添加虚函数概念,函数和运算符重载,引用、常量等
    C++2.0更加完善支持面向对象,新增保护成员、多重继承、对象的初始化、抽象类、静态成员以及const成员函数
    C++3.0进一步完善,引入模板,解决多重继承产生的二义性问题和相应构造和析构的处理
    C++98C++标准第一个版本,绝大多数编译器都支持,得到了国际标准化组织(ISO)和美国标准化协会认可,以模板方式重写C++标准库,引入了STL(标准模板库)
    C++03C++标准第二个版本,语言特性无大改变,主要:修订错误、减少多异性
    C++05

    C++标准委员会发布了一份计数报告(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制定中……

                

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

                  

    一、C++关键字(C++98版本)

    C++总计63个关键字,包含C语言的32个关键字

    该C++版本关键字表格:
    asmdoifreturntrycontinue
    autodoubleinlineshorttypedeffor
    booldynamic_castintsignedtypeidpublic
    breakelselongsizeoftypenamethrow
    caseenummutablestaticunionwchar_t
    catchexplicitnamespacestatic_castunsigneddefault
    charexportnewstructusingfriend
    classexternoperatorswitchvirtualregister
    constfalseprivatetemplatevoidtrue
    const_castfloatprotectedthisvolatilewhile
    deletegotoreinterpret_cast

    (红色关键字为之前C语言博客有提到或使用过的关键字)

             

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

                 

    二、namespace -- 命名空间关键字

    (1). 命名空间的作用:

    在C/C++中,变量、函数和后面要了解的类都是大量存在的,

    这些变量、函数和类的名称都将存在于全局作用域中,可能会导致很多冲突。

    使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,
    namespace关键字的出现就是针对这种问题的

    示例:

    【C++初阶】一、入门知识讲解(C++关键字、命名空间、C++输入&输出、缺省参数、函数重载)

                         

                         


                        

    (2). 命名空间的定义:

    • 定义命名空间,需要使用到namespace关键字,

      关键字后接命名空间的名称,然后再加上一对大括号{}即可,

      大括号{}中内容为命名空间的成员

                        

    • 在一般开发中,会使用项目的名称作为命名空间的名称

                              

      一般命名空间的定义:

      【C++初阶】一、入门知识讲解(C++关键字、命名空间、C++输入&输出、缺省参数、函数重载)

      命名空间嵌套子命名空间:

      【C++初阶】一、入门知识讲解(C++关键字、命名空间、C++输入&输出、缺省参数、函数重载)

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

                     

      • 一个工程中的 test.h(头文件) 和 text.cpp(C++文件)中
        两个同名命名空间会被合并成一个

        【C++初阶】一、入门知识讲解(C++关键字、命名空间、C++输入&输出、缺省参数、函数重载)

                             

                             


                            

        (3). 命名空间的使用:

        定义一个命名空间就定义了一个新的作用域,

        命名空间中的所有内容都局限于该命名空间中,

        所以不能通过直接调用来使用命名空间中的内容,

        命名空间的使用有三种方式:

                              

        方式一:

        加命名空间名称和作用域限定符

        • 作用域限定符(两个冒号) --   : :

          【C++初阶】一、入门知识讲解(C++关键字、命名空间、C++输入&输出、缺省参数、函数重载)

                                 

          方式二:

          using namespace 命名空间名称 展开命名空间

          • 使用 using namespace 命名空间名称 可以展开对应的命名空间,
            展开后可以直接通过该命名空间中成员的名称使用该成员

                                

          • 但是使用该方式对命名空间的展开,
            会导致命名空间的所有内容暴露出来,
            可能又会导致命名冲突问题

                           

          • 所以一般在自己使用时为了方便才会使用该方式,

            如果是项目工程,该方式一定要慎重使用,可能会出大问题的

            【C++初阶】一、入门知识讲解(C++关键字、命名空间、C++输入&输出、缺省参数、函数重载)

                             

            方式三:

            使用using关键字只展开命名空间中的某个成员

            • 通过方式二直接展开命名空间会有命名冲突的风险,

              那么我们可以通过:
              using 命名空间名称::指定成员

              来指定只展开命名空间中的某个成员

                                   

            • 这种方式是比较常用的,

              通常是对一些常用的成员(对象)进行使用,

              来避免频繁使用方式一调用命名空间,减轻代码冗余

              【C++初阶】一、入门知识讲解(C++关键字、命名空间、C++输入&输出、缺省参数、函数重载)

                          

              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

                           

              三、C++输出&输入

              C++中有了新的输入和输出方法,虽然说有了新的输入输出方法,

              但之前C语言中的输入和输出方法也是可以用的,

              在了解C++的输入和输出方法前,需要先了解以下概念:

                                   

                                   

              std -- C++标准库命名空间

              std是C++标准库的命名空间名,C++将标准库的定义实现都放在这个命名空间中,
              上一标题我们知道了使用命名空间的三种方式,而使用std命名空间的方式要考虑实际情况:

                             

              std命名空间的使用惯例:

              • 在自己的日常练习中,建议直接方式二即可,

                即:using namespace std

                这样使用std命名空间就很方便了,不用频繁使用方式一进行操作

                                 

              • 而在项目工程中,using namespace std 展开(方式二展开),
                标准库就全部暴露出来了,如果我们定义了跟库中重名的 类型/对象/函数 ,

                就会存在命名冲突问题。该问题在日常练习中很少出现,

                但是项目开发中代码较多、规模大,就很容易出现。

                                    

              • 所以建议在项目开发中使用方式三指定展开,

                即:using std::成员(对象)名

                来指定展开std命名空间中常用的几个库对象/类型/成员,

                像是C++输出时使用的cout,输入时使用的cin

                                     

                                     


                                    

                cout 和 cin

                • cout  --  console(控制台) out  --  标准输出对象(控制台)  --  流插入
                  cin  --  console(控制台) in  --  标准输入对象(键盘)  --  流提取

                                      

                • 使用cout标准输出对象和cin标准输入对象时,
                  需要包含 头文件(IO流头文件)以及 按命名空间使用方法使用std
                  注:C++ 头文件 不需要像C语言一样加“.h”后缀

                  早期标准库将所有功能在全局域中实现,声明在“.h”后缀的头文件中,
                  使用时只需包含对应头文件即可,后来将其(标准库所有功能)实现在std命名空间下,
                  为了和C语言头文件区分,也为了正确使用命名空间,规定C++头文件不加“.h”后缀。

                  旧编译器(vc 6.0)中还支持 格式,后续编译器已不支持,

                  因此推荐使用 + std命名空间 的方式

                                     

                  • cout 和 cin 是全局的流对象,endl(endline)是特殊的C++符号,表示换行输出,
                    他们都包含在 头文件 中

                                         

                  • 使用cout进行输出时还需要用到:   --  流提取运算符

                    (在C语言中,> 是位于算符,在C++中又多了以上身份)

                                    

                  • 使用C++输入和输出相对C语言更方便,
                    不需要像 scanf / printf 输入输出时要手动控制格式(%d、%p……),
                    C++的输入和输出可以自动识别变量类型

                                         

                  • 实际上 cout 和 cin 分别是 ostream 和 istream 类型的对象,
                    >> 和
VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]