第一讲:C++简介

目录链接

原课件链接


第一讲:C++简介


一、计算机语言的发展(低、高级语言;高……面向过程;高……面向对象;)

    计算机语言(Computer Lnguage)指用于人与计算机之间通讯的语言;是人与计算机之间传递信息的媒介。 
    低级语言---机器语言和汇编语言都是面向具体计算机的语言,每一种类型的计算机都有自己的机器语言和汇编语言,不同机器之间互不相通。由于它们依赖于具体的计算机,被称为“低级语言”。

    高级语言----它不依赖于具体的计算机,而是在各种计算机上都通用的一种计算机语言。

    高级语言接近人们习惯使用的自然语言和数学语言,使人们易于学习和使用,人们认为,高级语言的出现是计算机发展史上一次惊人的成就,使千万非专业人员能方便地编写程序,操纵使用计算机按人们的指令进行工作。 
    常用的高级语言有:BASIC(适合初学者应用)、FOPTRAN(用于数据计算)、COBOL(用于商业管理)、PASCAL(用于教学)、C(用于编写系统软件)、Ada(用于编写大型软件)、LISP(用于人工智能)等。
    计算机本身是不能直接识别高级语言的,必须将高级语言的程序翻译成计算机能识别的机器指令,计算机才能执行。这个翻译的工作是由“编译系统”软件来完成的。不同类型的计算机上使用的翻译软件是不同的。因此,在一台计算机上能运行某一种高级语言程序的条件是:必须在此计算机系统上配有此语言的编译系统。例如要在一台微机上运行C语言程序,必须先将为该微机设计的C编译系统装入计算机内。

二、计算机软件的发展过程(重点软件危机)

    计算机软件(computer software)---计算机系统中的程序和有关的文件。
     计算机程序---是计算任务的处理对象和处理规则的描述;
     计算机文件---是为了便于了解程序所需的资料说明。
     程序作为一种具有逻辑结构的信息,精确而完整地描述计算任务中的处理对象和处理规则。这一描述还必须通过相应的实体才能实现。记载上述信息的实体就是硬件。
    软件是用户与硬件之间的接口界面。软件的发展受到应用和硬件发展的推动和制约,发展过程大致可分为3个阶段。

    1、第一阶段:机器语言( 1946~1956 )。从第一台计算机上的第一个程序的出现到实用的高级程序设计语言出现以前。 这类程序的运行速度和效率都很高。但是可读性和可移植性很差,随着软件开发规模的扩大,这类面向机器的程序逐渐被以FORTRAN、C等为代表的面向过程的程序所取代。

    2、第二阶段:高级语言( 1956~1968 )。从实用的高级程序设计语言出现以后到软件工程出现以前。面向过程的语言虽可独立于计算机编写程序,但用这类语言编写程序时,程序不仅要说明做什么,更重要的是非常详细地告诉计算机如何做,程序需要详细描述解题的过程和细节。

    3、第三阶段(1968~ )。软件工程出现以后,应用领域迅速扩大,出现了嵌入式应用,其特点是受制于它所嵌入的宿主系统,而不是受制于功能要求。为了适应计算机网的需要,出现了网络软件。随着微型计算机的出现,分布式应用和分布式软件得到发展。同时,也开始了有关方法学的研究工作。这一阶段的研究对象增加了嵌入式软件、网络软件和分布式软件。编制方法主要是结构程序设计方法和软件工程方法。这一阶段普遍采用现代高级语言,即具有并行成分和实时成分的模块化语言。编制软件的工作方式逐步转向工程化。
 

软件危机(software crisis):

     落后的软件生产方式无法满足迅速增长的计算机软件需求,从而导致软件开发与维护过程中出现一系列严重问题的现象。 主要包含两方面的问题:如何开发软件,怎样满足对软件日益增长的需求;如何维护数量不断膨胀的已有软件。

    面对“软件危机”,人们调查研究了软件生产的实际情况,逐步感到采用工程化的方法从事软件系统的研究和维护的必要性,于是与程序设计方法学密切相关的软件工程在1968年应运而生。软件工程的主要对象是大型软件。软件工程研究的内容主要包括:软件质量保证和质量评价;软件研制和维护的方法、工具、文档;用户界面的设计以及软件管理等。软件工程的最终目的是摆脱手工生产软件的状况,逐步实现软件研制和维护的自动化。


软件危机的主要表现:
1. 对软件开发成本和进度的估计常常很不准确。 
    实际成本比估计成本有可能高出一个数量级,实际进度比预期进度拖延几个月甚至几年的现象并不罕见。这种现象降低了开发组织的信誉。为赶进度和节约成本所采取的权宜之计往往又损害了软件产品的质量,从而不可避免地引起用户的不满。 
2. 用户对“已完成的”软件系统不满意的现象经常发生。 
    软件开发人员常常在对用户需求只有模糊的了解,甚至对所要解决的问题还没有确切认识的情况下,就仓促上阵匆忙着手编写程序。软件开发人员和用户之间的交流往往很不充分,“闭门造车”必然导致最终产品不符合用户实际需要。 
3. 软件产品的质量常常靠不住。 
    软件可靠性和质量保证的确切定量概念刚刚出现,软件质量保证技术(审查、复审和测试)还没有坚持不懈地应用到软件开发的全过程中,这些都会导致软件产品发生质量问题。 
4. 软件常常是不可维护的。 
    程序中的错误很难改正,实际上不可能使这些程序适应新的硬件环境,也不能根据用户的需求在原有程序中增加新的功能。
5. 软件通常没有适当的文档资料。 
    软件不仅是程序,还应该有一整套文档资料。这些文档资料是在软件开发过程中产生出来的,而且应该是“最新的”(与代码完全一致)。缺乏文档必然给软件的开发和维护带来许多严重的困难和问题。 
6. 软件成本在计算机系统总成本中所占比例逐年上升。 
    随着微电子技术的进步和生产自动化程度的提高,硬件成本逐年下降,然而软件开发需要大量的人力,软件成本随着通货膨胀以及软件规模和数量的不断扩大而逐年上升。美国在1995年的调查表明,软件成本大约已占计算机系统总成本的90%。

     软件危机的出现,使得人们去寻找产生危机的内在原因,发现其原因可归纳为两方面,一方面是由软件生产本身存在着复杂性,另一方面却是与软件开发所使用的方法和技术有关。


解决途径:---软件开发所使用的方法和技术
    软件工程诞生于60年代末期,它作为一个新兴的工程学科,主要研究软件生产的客观规律性,建立与系统化软件生产有关的概念、原则、方法、技术和工具,指导和支持软件系统的生产活动,以期达到降低软件生产成本 、改进软件产品质量、提高软件生产率水平的目标。软件工程学从硬件工程和其他人类工程中吸收了许多成功的经验,明确提出了软件生命周期的模型,发展了许多软件开发与维护阶段适用的技术和方法,并应用于软件工程实践,取得良好的效果。
在软件开发过程中人们开始研制和使用软件工具,用以辅助进行软件项目管理与技术生产,人们还将软件生命周期各阶段使用的软件工具有机地集合成为一个整体,形成能够连续支持软件开发与维护全过程的集成化软件支援环境,以期从管理和技术两方面解决软件危机问题。
此外,人工智能与软件工程的结合成为80年代末期活跃的研究领域。基于程序变换、自动生成和可重用软件等软件新技术研究也已取得一定的进展,把程序设计自动化的进程向前推进一步。在软件工程理论的指导下,发达国家已经建立起较为完备的软件工业化生产体系,形成了强大的软件生产能力 。软件标准化与可重用性得到了工业界的高度重视,在避免重用劳动,缓解软件危机方面起到了重要作用。
软件工程正是为克服软件危机而提出的一种概念,并在实践中不断地探索它的原理,技术和方法。在此过程中,人们研究和借鉴了工程学的某些原理和方法,并形成了一门新的学科─软件工程学,但可惜的是时至今日人们并没有完全克服软件危机。

 

三、目前世界流行的高级程序设计语言有下列几种:

    1、FORTRAN语言。是一种用于科学计算的高级语言;FORTRAN语言是世界上第一个被正式推广使用的高级语言。它是1954年被提出来的,1956年开始正式使用,至今已有三十多年的历史,但仍历久不衰,它始终是数值计算领域所使用的主要语言。FORTRAN语言是Formula Translation的缩写,意为“公式翻译”。它是为科学、工程问题或企事业管理中的那些能够用数学公式表达的问题而设计的,其数值计算的功能较强。
    2、BASIC语言。它是1964年被提出来由FORTRAN语言派生出来的语言,是一种应用很广的程序设计语言。国内外几乎所有的微机系统和许多小型机都配备有这种语言。
    3、COBOL语言。它是一种类似于英语的用于商业及数据处理的语言;1959 Grace Murray Hopper开始开发COBOL(COmmon Business-Oriented Language)语言,完成于1961年。
    4、 LISP语言。1958年符号处理用的高级语言开始进入实用阶段,1972年派生出来Prolog语言, 人工智能语言,常称为第五代语言, PROLOG,LISP人工智慧常用语言。
    5、Ada语言。是1980年公布的高级语言, ada 语言一种通用程序设计语言。它具有如PASCAL等通用语言和某些专用语言的长。
    6、ALGOL语言。ALGOL的语句和普通语言表达式接近,更适于数值计算;1960 ALGOL第一个结构化程序设计语言推出。
    7、Simula 67语言。1967年5月20日,挪威科学家Ole-Johan Dahl和Kristen Nygaard正式发布了Simula 67语言。Simula 67被认为是最早的面向对象程序设计语言,它引入了所有后来面向对象程序设计语言所遵循的基础概念:对象、类、继承。在1968年2月形成了Simula 67的正式文本。1967年Simula'67首次提出把数据和操作放在一起的思想,以模拟人类的思维方法,OOP趋于成熟 。(面向对象的软件开发过程可以大体划分为面向对象的分析(object oriented analysis,OOA)、面向对象的设计(object oriented design,OOD)、面向对象的实现(object oriented programming,OOP)三个阶段。)从80年代中期到90年代,面向对象语言十分热门,大批比较实用的面向对象编程语言行成Simula'80。 它的原型ALGOL 60语言。
    8、C语言。
     1963年,剑桥大学将ALGOL 60语言发展成为CPL(Combined Programming Language)语言。 
   1967年,剑桥大学的Matin Richards 对CPL语言进行了简化,于是产生了BCPL语言。 
   1970年,美国贝尔实验室的Ken Thompson将BCPL进行了修改,并为它起了一个有趣的名字“B语言”。意思是将CPL语言煮干,提炼出它的精华。并且他用B语言写了第一个UNIX操作系统。 
   而在1973年,B语言也给人“煮”了一下,美国贝尔实验室的D.M.RITCHIE在B语言的基础上最终设计出了一种新的语言,他取了BCPL的第二个字母作为这种语言的名字,这就是C语言。 
   为了使UNIX操作系统推广,1977年Dennis M.Ritchie 发表了不依赖于具体机器系统的C语言编译文本《可移植的C语言编译程序》。 
   1978年Brian W.Kernighian和Dennis M.Ritchie出版了名著《The C Programming Language》,从而使C语言成为目前世界上流行最广泛的高级程序设计语言。 
   1988年,随着微型计算机的日益普及, 出现了许多C语言版本。由于没有统一的标准,使得这些C语言之间出现了一些不一致的地方。为了改变这种情况,美国国家标准研究所(ANSI)为C语言制定了一套ANSI标准, 成为现行的C语言标准 3.0语言的主要特点 。
    9、Java语言。 Java语言的设计可以追溯到1991年,SUN MicorSystem 公司为了开发消费电子产品市场,成立了由Jame Gosling、Bill Joe等人组成的Green开发小组。他们发现现有的语言如C/C++等在安全性和对芯片与操作系统的依赖性方面并不适合家用消费电子产品,于是他们开发了一个名为 Oak(一种橡树的名字)的软件,但当时并没有引起人们的注意 。后来Oak演变为更实用的系统star5even(7),但这些技术上成功的产品并未获得商业上的成功。
    直到1994年下半年,Internet 就的迅猛发展,环球信息网www的快速增长,使得 SUN 公司把 Oak 的技术应用于网络,并正式命名为Java。1995年 ,SUN公司正式发布了Java语言,Java在网络上的独特优势使得它逐渐成为Internet上受欢迎的开发与编程语言,一些著名的计算机公司纷纷购买了 Java 语言的使用权,如MicroSoft、IBM 、Netscape 、Novell 、Apple 、DEI 、SGI等。1996年SUN公司成立了Java soft分公司来维护和发展Java语言。

四、C++的起源

    随着计算机技术的不断发展以及软件程序的高度复杂化,面向对象程序设计的重要性也越来越突显出来,而C++语言则是面向对象程序设计的最重要的代表性语言之一。
    C++语言是在C语言的基础上逐步发展和完善起来的,因此介绍C++语言不妨首先回顾一下C语言的发展。
    1967年,Martin Richards为编写操作系统软件和编译程序开发了BCPL语言(Basic Combined Programming Language);1970年,Ken Thompson在继承BCPL语言的许多优点的基础上开发了实用的B语言;1972年,贝尔实验室的Dennis Ritchie在B语言的基础上,作了进一步的充实和完善,开发出了C语言。当时,设计C语言是为了编写UNIX操作系统,以后,C语言经过多次改进,逐渐开始流行。目前常用的C语言版本基本上都是以ANSI C为基础的。
    C语言具有许多优点,比如语言简洁灵活;运算符和数据结构丰富;具有结构化控制语句;程序执行效率高;同时具有高级语言和汇编语言的优点等。与其他高级语言相比,C语言具有可以直接访问物理地址的优点,与汇编语言相比又具有良好的可读性和可移植性。因此,C语言得到了极为广泛的应用。
    随着C语言应用的推广,C语言存在的一些缺陷或不足也开始暴露出来,并受到大家的关注。比如C语言对数据类型检查的机制比较弱,缺少支持代码重用的结构;随着软件工程规模的扩大,难以适应开发特大型程序。同时C语言毕竟是一种面向过程的编程语言,已经不能满足运用面向对象的方法开发软件的需要。C++便在C语言基础上,为克服C语言本身存在的缺点,同时为支持面向对象的程序设计而研制出来的一种通用的程序设计语言,它是在1980年由贝尔实验室的Bjarne Stroustrup创建的。
    研制C++的一个重要目标是使C++首先是一个更好的C,所以C++根除了C中存在的问题。C++的另一个重要目标就是面向对象的程序设计,因此在C++中引入了类的机制。最初的C++被称为“带类的C”,1983年正式命名为C++(C Plus Plus)。以后经过不断完善,形成了目前的C++。
    当前运用得较为广泛的C++有Microsoft公司的Visual C++(简称VC++)和Borland公司的Borland C++(简称BC++)。本书以Microsoft Visual C++ 6.0集成环境为例介绍C++语言。
C++语言是在被广泛应用的C语言的基础上发展起来的。C++语言在C语言已有的功能的基础上,强化了C语言的基本功能,特别是增加了对类的处理能力,即:
        C++语言=C语言+基本功能的扩充+类功能
    从这一公式不难看出,C++语言几乎完全继承了C语言的所有功能。从表面上看来,由于C++语言继承了C语言的所有功能,因此,只要学会了C语言,就应该很容易学会C++语言,其实不然。就类本身来讲,就包含了很多复杂的概念,而对于这些概念的正确理解则是学好面向对象程序设计语言的关键。同时,C语言是面向函数的程序设计语言,而C++语言则是面向对象的程序设计语言,这样,在程序设计过程方面就有很大差别。
    考虑到C++语言的语法现象和程序设计特点,大部分读者都学过C语言,同时也考虑到C++语言作为一门独立的课程应具有其系统性,因此,对于C语言中已有的内容,只进行简单的介绍,而把主要篇幅用于对C++语言特有的语法现象的说明上。特别是,为了使同学能够尽快利用C++语言来解决实际问题,在本书的每一章中都给出了大量的例子,这些例子对于理解C++语言的语法现象、完整掌握C++语言的特点是非常有益的。同时,考虑到面向对象程序设计语言的特点,通过对这些实例的学习,能够使同学们可进一步掌握面向对象程序设计的要点,并能达到举一反三的目的。
    按照循序渐进的原则,逐步地介绍C++语言的基本概念和语法规则,特别是花费大量的篇幅来详细讲解面向对象程序设计的两个基本概念——类和继承。书中的所有例题都在Visual C++环境下测试完成。每章的最后都附有一定量的习题,这些习题对于读者巩固已学的内容是大有益处的。
我们认为,要学好C++语言,除了掌握C++语言的基本理论之外,还必须加强实践环节,读者可以边学习边上机。刚开始时可以调试本书中的例题,待学习一段时间之后,就可以调试自己编写的程序了。只有这样,才能加快学习进度,提高学习效率。
    问题:C与C++?
    解释1:C++是由于开发大型应用软件的需要而产生的,内部的对象中的方法的构建应用了结构化程序设计。
    解释2:面向对象的基础是面向过程。C++是面向对象的语言,要学习C++,须学好C语言。

五、 运行C++程序的步骤和方法

(一)C++程序设计步骤(5步)
    在前面已经看到了一些用c++语言编写的程序。但是,写出了程序并不等于问题已经解决了,因为还没有上机运行,没有得到最终的结果。一个程序从编写到最后得到运行结果要经历以下一些步骤。
    1、用C++语言编写程序
    所谓程序,就是一组计算机系统能识别和执行的指令。每一条指令使计算机执行特定的操作。用高级语言编写的程序称为源程序(source program)。C++的源程序是以 .cpp作为后缀的(cpp是cplusplus的缩写)。
    2、对源程序进行编译
    从根本上说,计算机只能识别和执行由。和l组成的二进制的指令,而不能识别和执行用高级语言写的指令。为了使计算机能执行高级语言源程序,必须先用一种称为“编译器(complier)”的软件(也称编译程序或编译系统),把源程序翻译成二进制形式的“目标程序(object program)”。
    编译是以源程序文件为单位分别编译的,每一个程序单位组成一个源程序文件,如果有多个程序单位,系统就分别把它们编译成多个目标程序。目标程序一般以.obj或.o作为后缀(object的缩写)。编译的作用是对源程序进行词法检查和语法检查。词法检查是检查源程序中的单词拼写是否有错,例如把main错拼为mlan。语法检查是根据源程序的上下文来检查程序的语法是否有错,例如在cout语句中输出变量a的值,但是在前面并没有定义变量a。编译时对文件中的全部内容进行检查,编译结束后显示出所有的编译出错信息。一般编译系统给出的出错信息分为两种,一种是错误(error);一种是警告(warning),指一些不影响运行的轻微的错误(如定义了一个变量,却一直没有使用过)。凡是检查出error类的错误,就不生成目标程序,必须改正后重新编译。
    3、将目标文件连接
    在改正所有的错误并全部通过编译后,得到一个或多个目标文件。此时要用系统提供的“连接程序(linker)”将一个程序的所有目标程序和系统的库文件以及系统提供的其他信息连接起来,最终形成一个可执行的二进制文件,它的后缀是.exe,是可以直接执行的。
    4、运行程序 
    运行最终形成的可执行的二进制文件(.exe文件),得到运行结果。
    5、分析运行结果
    如果运行结果不正确,应检查程序或算法是否有问题。
    以上过程如图下所示。其中实线表示操作流程,虚线表示文件的输入输出。例如,编辑后得到一个源程序文件f.cpp,然后在进行编译时再将源程序文件f.cpp输入,经过编译得到目标程序文件f.obj,再将目标程序文件f.obj输入内存,与系统提供的库文件等连接,得到可执行文件f.exe,最后把f.exe调入内存并使之运行。

 
图1.6C++操作流程


 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++ 中,`std::bind` 是一个函数模板,用于将函数或函数对象与一组参数绑定。它可以用于将函数对象包装成另一个函数对象,或者将一个函数的一部分参数绑定到特定的值,以形成一个新的函数对象。 例如,假设有一个函数 `add(int a, int b)`,可以使用 `std::bind` 将其中一个参数绑定到特定的值上,例如: ``` #include <functional> #include <iostream> int add(int a, int b) { return a + b; } int main() { auto add_five = std::bind(add, 5, std::placeholders::_1); std::cout << add_five(3) << std::endl; // 输出 8 return 0; } ``` 在这个例子中,`add_five` 是一个函数对象,它将 `5` 作为第一个参数传递给 `add` 函数,并将其第二个参数绑定到 `std::placeholders::_1`,这个占位符表示在调用 `add_five` 时将使用的第二个参数。 `std::bind` 还可以用于将成员函数与对象绑定,例如: ``` #include <functional> #include <iostream> class Foo { public: Foo(int num) : num_(num) {} int add(int a, int b) { return a + b + num_; } private: int num_; }; int main() { Foo foo(2); auto add_five = std::bind(&Foo::add, &foo, 5, std::placeholders::_1); std::cout << add_five(3) << std::endl; // 输出 10 return 0; } ``` 在这个例子中,`add_five` 将 `Foo::add` 绑定到 `foo` 对象上,并将 `5` 绑定到第一个参数 `a` 上,将 `std::placeholders::_1` 绑定到第二个参数 `b` 上。在调用 `add_five` 时,`&foo` 将作为 `this` 指针传递给 `Foo::add` 函数。最后,`add_five(3)` 将返回 `a + b + num_` 的值,即 `5 + 3 + 2 = 10`。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值