C++学习——背景

        编程语言的世界排名前四已经长时间被Java、C、C++、Python这四种语言所占据。前几年Java因其应用面更广泛而持续居于榜首,但在人工智能领域,Python编程相较于Java,或许更加清爽、整洁、漂亮,2023年排名中Python位于榜首。

        不过,从某种程度上说,Python编程只是在搭建软件的外包装,而C++才是其核心。C++与C在占据系统底层应用方面没有什么差距,但是在规模化编程、自动生成、实现系统架构方面,非C++莫属。追本溯源,C++语言才是当今人工智能大发展上最重要的工具。

C支持结构化程序设计,C++既能很好支持结构化程序设计,又能支持面向对象程序设计甚至模板化程序设计。C++包含了整个C,C是建立C++的基础。C++包括C的全部特征、属性和优点,同时添加了对面向对象编程(OOP)的完全支持。

1. 程序与语言

1.1 程序

        程序是以某种语言为工具编制出来的动作序列,它表达了人的思想。计算机程序是用计算机程序设计语言所要求的规范书写出来的一系列动作,它表达了程序员要求计算机执行的操作。

        对于计算机来说,一组机器指令就是程序。当我们说机器代码或者机器指令时,都是指的程序,它是按计算机硬件设计规范的要求编制出来的动作序列。

        对于使用计算机的人来说,程序员用某高级语言编写的语句序列也是程序。程序通常是以文件的形式保存起来,所以,源文件、源程序和源代码都是程序。

        程序是任何有目的的、预想好的动作序列。它构成软件。计算机要运转起来,需要一整套可运行软件,即计算机程序。

1.2 程序语言的发展

        最初,程序员使用最原始的计算机指令,即机器语言程序。只有机器语言才能为机器所识别和运行。这些指令由一串二进制的数表示,例如11011001。不久,汇编语言出现了,它可以将机器指令映射为一些能被人读懂的助记符,如ADD,SUB。程序员运行汇编程序将用助记符写成的源程序转换为机器指令,然后再运行机器指令程序,得到所要的结果。那时,编写程序的都是计算机专业人员,编写程序的语言都是低级的或者较低级的。

        以后,随着硬件的发展,Fortran、BASIC、C等几十种甚至几百种高级语言应运而生,中间经历了严酷的优胜劣汰过程,最后剩下的是一些比较优秀的高级语言。C++首当其冲。

        多年来,计算机程序的主要目标是力求编写出短小的代码以使运行速度更快,因为硬件成本和上机运行费很高。当计算机变得更小、更廉价、运行速度更快时、计算机硬件和运行的成本快速下降,而程序员开发程序、维护程序的费用却急剧上升,程序设计的目标也就发生了变化。

        在程序正确的前提下,可读性、易维护、可移植是程序设计首要的目标。可读,即使用良好的书写风格和易懂的语句编写程序;易维护,即当业务需求发生变化时,不需要太多的开销就可以扩展和增强程序的功能;可移植,即编写的程序在各种计算机和操作系统上都能运行,并且运行结果一样。

1.3 高级语言与低级语言

        C++语言是高级语言,机器语言是低级语言,汇编语言基本上是低级语言。例如,对于C++语言的语句:

a = 3 * a - 2 * b + 1;

写成汇编语言和对应的机器语言为:

mov eax, DWORD PTR a_$ [ebp]              8b 45 fc  //将a放入寄存器eax中(ebp为数据段指针 
                                                    //a_$是变量a的偏移位置)
lea eax, DWORD PTR [eax + eax *2]         8d 04 40  //将eax内容加上2倍eax的内容放到eax中
mov eax, DWORD PTR b_$ [ebp]              8b 4d f8  //将b放入ecx中
add ecx, ecx                              03 c9     //将ecx内容加上ecx,即ecx中的值为2*b
sub eax, ecx                              2b c1     //将eax的减去ecx的值放入eax
inc eax                                   40        //eax内容加1
mov DWORD PTR a_$ ebp], eax               89 45 fc  //把eax的值放入a变量中

        可以看出,程序语言越低级,描写程序越复杂,指令越难懂。语言越低级,就越靠近机器;语言越高级,就越靠近人的表达与理解。

        程序语言的发展,总是从低级到高级,直到可以用人的自然语言来描述。

        程序语言的发展,也是从具体到抽象的发展过程。编置一个 表达式,无需将表达式的具体操作过程描述出来,否则人会感到太累,大量的精力会被无谓的浪费,无法进行更大规模的设计与思考;而低级语言必须详尽地描述任何操作。所以抽象表达能力越强,语言越高级。

2. 结构化程序设计

        结构化程序设计由迪克斯特拉(E.W.dijkstra)在1969年提出,是以模块化设计为中心,将待开发的软件系统划分为若干个相互独立的模块,这样使完成每一个模块的工作变得单纯而明确,为设计一些较大的软件打下了良好的基础。结构化程序设计的主要思想是自顶向下、逐步求精

         虽然结构化程序设计方法具有很多的优点,但它仍是一种面向过程的程序设计方法,它把数据和处理数据的过程分离为相互独立的实体。当数据结构改变时,所有相关的处理过程都要进行相应的修改,每一种相对于老问题的新方法都要带来额外的开销,程序的可重用性差。

        由于图形用户界面的应用,程序运行由顺序运行演变为事件驱动,使得软件使用起来越来越方便,但开发起来却越来越困难,对这种软件的功能很难用过程来描述和实现,使用面向过程的方法来开发和维护都将非常困难。

3.面向对象程序设计

        面向对象程序设计的本质是把数据和处理数据的过程当成一个整体——对象。

        C++充分支持面向对象程序设计。面向对象程序设计的实现需要封装和数据隐藏技术,需要继承多态性技术。

3.1 封装和数据隐藏

        当一个技术人员要安装一台计算机时,他将各个设备组装起来。当他想要一个声卡时,不需要用原始的集成电路芯片和材料去制作一个声卡,而是购买一个他所需要的某种功能的声卡。技术员关心的是声卡的功能,并不关心声卡内部的工作原理。声卡是自成一体的。这种自成一体性称为封装性。技术员无须知道声卡的工作原理就能有效的使用它。

        C++通过建立用户定义类型(类)支持封装性和数据隐藏。完好定义的类一旦建立,就可以看成是完全封装的实体,可以作为一个整体单元使用。类的实际内部工作应当隐藏起来,使用完好定义的类的用户不需要知道类是如何工作的,只需要知道如何使用它就行。

3.2 继承和重用

        要制造新的电视机,可以有两种选择:一种是从草图开始;另一种是对现有的型号加以改进。也许现有的型号已经令人满意,但如果再加一个功能,会更加完美。电视机工程师肯定不想从头开始,而是希望制造另一种新型电视机,该机是在原有的型号基础上增加一组电路做成的。新的电视机很快就制造出来了,被赋予一种新的型号,于是新型电视机就诞生了。这是继承和重用的实例。

        C++采用继承支持重用的思想,程序可以在扩展现有类型的基础上声明新类型。新子类是从现有类型派生出来的,称为派生类。新型电视机是在原有型号的电视机上增加若干种功能而得到的,所以新型电视机是原有电视机的派生,继承了原有电视机的所有属性并在此基础上增加了新的功能。

3.3 多态性

        通过继承的方法构造类,采用多态性为每个类指定表现行为。例如,学生类应该有一个计算成绩的操作。大学生继承了中学生,或者说是中学生的延伸。对于中学生,计算成绩的操作表示语文、数学、英语等课程的成绩计算;而对于后继的大学生,计算成绩的操作表示高等数学、计算机、普通物理等课程的成绩计算。

        继承性和多态性的组合,可以轻易地生成一系列虽相似但独一无二地对象。由于继承性,这些对象共享许多相似的特征。但由于多态性,一个对象可以有独特的表现形式,而另一个对象有另一种表现形式。

4. 程序开发过程

        大多数现代的编译程序都提供了一个集成开发环境。在这样一个环境中,一般是从菜单中选定compile或make或build命令,来生成可执行的计算机程序。

        程序员编制的源程序被编译(compile)后,会生成一个目标文件,这个文件通常以.obj作为文件扩展名。该目标文件为源程序的目标代码,即机器语言指令。但这仍然不是一个可执行的程序,因为目标代码只是一个个的程序块,需要相互衔接称为一个适应一定的操作系统环境的程序整体。为了把它转换为可执行程序,必须进行连接(link)。

        C++程序通常是通过同时连接一个或几个目标文件与一个或几个库而创建的。库(.lib)是一组由机器指令构成的程序代码,是可连接文件。库有标准库和用户生成的库,标准库是由C++提供的,用户提供的库是由软件开发商或程序员提供的。文件与库的连接的结果,即生成计算机可执行的程序。

        程序员首先在集成开发环境中编辑源程序,或在其他编辑器中输入源程序,然后,在集成环境中启动编译程序将源程序转化为目标文件。编译之后,很有可能产生一些编译错误,于是程序员回到编辑状态重新开始编辑程序和编译。同样在紧接着的连接和运行中也会遇到连接或运行错误,此时,又回到编辑状态修改源程序。

5.参考书籍

        C++程序设计教程(第三版通用版)

  • 36
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值