c++9上海交大(针对谭浩强的书)

合集下载

(C++_面向对象程序设计_谭浩强)第1章__C++的初步知识

(C++_面向对象程序设计_谭浩强)第1章__C++的初步知识

C++程序设计中国高等院校计算机基础教育课程体系规划教材谭浩强编著总目录第1篇基本知识第1章C++的初步知识第2章数据类型与表达式第2篇面向过程的程序设计第3章程序设计初步第4章函数与预处理第5章数组第6章指针第7章自定义数据类型第3篇基于对象的程序设计第8章类和对象第9章关于类和对象的进一步讨论第10章运算符重载第4篇面向对象的程序设计第11章继承与派生第12章多态性与虚函数第13章输入输出流第14章C++工具第1章C++的初步知识第2章数据类型与表达式第1篇基本知识第1章C++的初步知识*1.1 从C到C++*1.2 最简单的C++程序1.3 C++程序的构成和书写形式1.4 C++程序的编写和实现1.5 关于C++上机实践*1.1 从C到C++计算机诞生初期,人们要使用计算机必须用机器语言或汇编语言编写程序。世界上第一种计算机高级语言诞生于1954年,它是FORTRAN 语言。先后出现了多种计算机高级语言。其中使用最广泛、影响最大的当推BASIC语言和C语言。BASIC语言是1964年在FORTRAN语言的基础上简化而成的,它是为初学者设计的小型高级语言。C语言是1972年由美国贝尔实验室的D.M.Ritchie研制成功的。它不是为初学者设计的,而是为计算机专业人员设计的。大多数系统软件和许多应用软件都是用C语言编写的。但是随着软件规模的增大,用C语言编写程序渐渐显得有些吃力了。C++是由AT&T Bell(贝尔)实验室的Bjarne Stroustrup博士及其同事于20世纪80年代初在C语言的基础上开发成功的。C++保留了C语言原有的所有优点,增加了面向对象的机制。C++是由C发展而来的,与C兼容。用C语言写的程序基本上可以不加修改地用于C++。从C++的名字可以看出它是C的超集。C++既可用于面向过程的结构化程序设计,又可用于面向对象的程序设计,是一种功能强大的混合型的程序设计语言。C++对C的“增强”,表现在两个方面:(1) 在原来面向过程的机制基础上,对C语言的功能做了不少扩充。(2) 增加了面向对象的机制。面向对象程序设计,是针对开发较大规模的程序而提出来的,目的是提高软件开发的效率。不要把面向对象和面向过程对立起来,面向对象和面向过程不是矛盾的,而是各有用途、互为补充的。学习C++,既要会利用C++进行面向过程的结构化程序设计,也要会利用C++进行面向对象的程序设计。本书既介绍C++在面向过程程序设计中的应用,也介绍C++在面向对象程序设计中的应用。*1.2 最简单的C++程序例1.1 输出一行字符: “This is a C++ program.”。程序如下:#include <iostream> //包含头文件iostreamusing namespace std; //使用命名空间stdint main( ){cout<<″This is a C++ program.″;return 0;}在运行时会在屏幕上输出以下一行信息:This is a C++ program.用main代表“主函数”的名字。每一个C++程序都必须有一个main 函数。main前面的int的作用是声明函数的类型为整型。程序第6行的作用是向操作系统返回一个零值。如果程序不能正常执行,则会自动向操作系统返回一个非零值,一般为-1。函数体是由大括号{ }括起来的。本例中主函数内只有一个以cout开头的语句。注意C++所有语句最后都应当有一个分号。再看程序的第1行“#include <iostream>”,这不是C++的语句,而是C++的一个预处理命令,它以“#”开头以与C++语句相区别,行的末尾没有分号。#include <iostream>是一个“包含命令”,它的作用是将文件iostream的内容包含到该命令所在的程序文件中,代替该命令行。文件iostream的作用是向程序提供输入或输出时所需要的一些信息。iostream是i-o-stream 3个词的组合,从它的形式就可以知道它代表“输入输出流”的意思,由于这类文件都放在程序单元的开头,所以称为“头文件”(head file)。在程序进行编译时,先对所有的预处理命令进行处理,将头文件的具体内容代替#include命令行,然后再对该程序单元进行整体编译。程序的第2行“using namespace std; ” 的意思是“使用命名空间std”。C++标准库中的类和函数是在命名空间std中声明的,因此程序中如果需要用到C++标准库(此时就需要用#include命令行),就需要用“using namespace std; ”作声明,表示要用到命名空间std中的内容。在初学C++时,对本程序中的第1,2行可以不必深究,只需知道: 如果程序有输入或输出时,必须使用“#include<iostream>”命令以提供必要的信息,同时要用“using namespace std;” ,使程序能够使用这些信息,否则程序编译时将出错。例1.2 求a和b两个数之和。可以写出以下程序:// 求两数之和(本行是注释行)#include <iostream> //预处理命令using namespace std; //使用命名空间stdint main( ) //主函数首部{ //函数体开始int a,b,sum; //定义变量cin>>a>>b; //输入语句sum=a+b;//赋值语句cout<<″a+b=″<<sum<<endl; //输出语句return 0; //如程序正常结束,向操作系统返回一个零值} //函数结束本程序的作用是求两个整数a和b之和sum。第1行“//求两数之和”是一个注释行,C++规定在一行中如果出现“//”,则从它开始到本行末尾之间的全部内容都作为注释。如果在运行时从键盘输入123 456↙则输出为a+b=579例1.3 给两个数x和y,求两数中的大者。在本例中包含两个函数。#include <iostream> //预处理命令using namespace std;int max(int x,int y)//定义max函数,函数值为整型,形式参数x,y为整型{ //max函数体开始int z;//变量声明,定义本函数中用到的变量z为整型if(x>y) z=x;//if语句,如果x>y,则将x的值赋给zelse z=y; //否则,将y的值赋给zreturn(z);//将z的值返回,通过max带回调用处} //max函数结束int main( ) //主函数{ //主函数体开始int a,b,m;//变量声明cin>>a>>b;//输入变量a和b的值m=max(a,b); //调用max函数,将得到的值赋给mcout<<″max=″<<m<<′\\n′;//输出大数m的值return 0; //如程序正常结束,向操作系统返回一个零值} //主函数结束本程序包括两个函数:主函数main和被调用的函数max。程序运行情况如下:18 25 ↙(输入18和25给a和b)max=25 (输出m的值)注意输入的两个数据间用一个或多个空格间隔,不能以逗号或其他符号间隔。在上面的程序中,max函数出现在main函数之前,因此在main函数中调用max函数时,编译系统能识别max是已定义的函数名。如果把两个函数的位置对换一下,即先写main函数,后写max函数,这时在编译main函数遇到max时,编译系统无法知道max代表什么含义,因而无法编译,按出错处理。为了解决这个问题,在主函数中需要对被调用函数作声明。上面的程序可以改写如下:#include <iostream>int main( ){ int max(int x,int y);//对max函数作声明int a,b,c;cin>>a>>b;c=max(a,b); //调用max函数cout<<″max=″<<c<<endl;return 0;}int max(int x,int y)//定义max函数{ int z;if(x>y) z=x;else z=y;return(z);}只要在被调用函数的首部的末尾加一个分号,就成为对该函数的函数声明。函数声明的位置应当在函数调用之前。下面举一个包含类(class)和对象(object)的C++程序,目的是使读者初步了解C++是怎样体现面向对象程序设计方法的。例1.4 包含类的C++程序。#include <iostream>// 预处理命令class Student// 声明一个类,类名为Student{private:// 以下为类中的私有部分int num; // 私有变量numint score; // 私有变量scorepublic:// 以下为类中的公用部分void setdata( ) // 定义公用函数setdata{cin>>num; // 输入num的值cin>>score; // 输入score的值}void display( ) // 定义公用函数display{cout<<″num=″<<num<<endl; // 输出num的值cout<<″score=″<<score<<endl;//输出score的值};}; // 类的声明结束Student stud1,stud2; //定义stud1和stud2为Student类的变量,称为对象int main( )// 主函数首部{stud1.setdata( ); // 调用对象stud1的setdata函数stud2.setdata( ); // 调用对象stud2的setdata函数stud1.display( ); // 调用对象stud1的display函数stud2.display( ); // 调用对象stud2的display函数return 0;}在一个类中包含两种成员: 数据和函数,分别称为数据成员和成员函数。在C++中把一组数据和有权调用这些数据的函数封装在一起,组成一种称为“类(class)”的数据结构。在上面的程序中,数据成员num,score和成员函数setdata,display组成了一个名为Student的“类”类型。成员函数是用来对数据成员进行操作的。也就是说,一个类是由一批数据以及对其操作的函数组成的。类可以体现数据的封装性和信息隐蔽。在上面的程序中,在声明Student类时,把类中的数据和函数分为两大类: private(私有的)和public(公用的)。把全部数据(num,score)指定为私有的,把全部函数(setdata,display)指定为公用的。在大多数情况下,会把所有数据指定为私有,以实现信息隐蔽。具有“类”类型特征的变量称为“对象”(object)。程序中第18~24行是主函数。程序运行情况如下:1001 98.5 ↙(输入学生1的学号和成绩)1002 76.5 ↙(输入学生2的学号和成绩)num=1001 (输出学生1的学号)score=98.5 (输出学生1的成绩)num=1002 (输出学生2的学号)score=76.5 (输出学生2的成绩)1.3 C++程序的构成和书写形式C++程序的结构和书写格式归纳如下:(1) 一个C++程序可以由一个程序单位或多个程序单位构成。每一个程序单位作为一个文件。在程序编译时,编译系统分别对各个文件进行编译,因此,一个文件是一个编译单元。(2) 在一个程序单位中,可以包括以下几个部分:①预处理命令。上节4个程序中都包括#include命令。②全局声明部分(在函数外的声明部分)。在这部分中包括对用户自己定义的数据类型的声明和程序中所用到的变量的定义。③函数。函数是实现操作的部分,因此函数是程序中必须有的和最基本的组成部分。每一个程序必须包括一个或多个函数,其中必须有一个(而且只能有一个)主函数(main函数)。但是并不要求每一个程序文件都必须具有以上3个部分,可以缺少某些部分(包括函数)。(3) 一个函数由两部分组成:①函数首部,即函数的第一行。包括函数名、函数类型、函数属性、函数参数(形参)名、参数类型。一个函数名后面必须跟一对圆括号, 函数参数可以缺省,如int main( )。②函数体,即函数首部下面的大括号内的部分。如果在一个函数中有多个大括号,则最外层的一对{ }为函数体的范围。函数体一般包括:•局部声明部分(在函数内的声明部分)。包括对本函数中所用到的类型、函数的声明和变量的定义。对数据的声明既可以放在函数之外(其作用范围是全局的),也可以放在函数内(其作用范围是局部的,只在本函数内有效)。•执行部分。由若干个执行语句组成,用来进行有关的操作,以实现函数的功能。(4) 语句包括两类。一类是声明语句,另一类是执行语句。C++对每一种语句赋予一种特定的功能。语句是实现操作的基本成分,显然,没有语句的函数是没有意义的。C++语句必须以分号结束。(5) 一个C++程序总是从main函数开始执行的,而不论main函数在整个程序中的位置如何。(6) 类(class)是C++新增加的重要的数据类型,是C++对C的最重要的发展。有了类,就可以实现面向对象程序设计方法中的封装、信息隐蔽、继承、派生、多态等功能。在一个类中可以包括数据成员和成员函数,他们可以被指定为私有的(private)和公用的(public)属性。私有的数据成员和成员函数只能被本类的成员函数所调用。(7)C++程序书写格式自由,一行内可以写几个语句, 一个语句可以分写在多行上。C++程序没有行号,也不像FORTRAN或COBOL那样严格规定书写格式(语句必须从某一列开始书写)。(8) 一个好的、有使用价值的源程序都应当加上必要的注释,以增加程序的可读性。C++还保留了C语言的注释形式,可以用“/*……*/”对C++程序中的任何部分作注释。在“/*”和“*/”之间的全部内容作为注释。用“//”作注释时,有效范围只有一行,即本行有效,不能跨行。而用“/*……*/”作注释时有效范围为多行。只要在开始处有一个“/*”,在最后一行结束处有一个“*/”即可。因此,一般习惯是: 内容较少的简单注释常用“//”,内容较长的常用“/*……*/ ”。1.4 C++程序的编写和实现一个程序从编写到最后得到运行结果要经历以下一些步骤。1. 用C++语言编写程序用高级语言编写的程序称为“源程序”(source program)。C++的源程序是以.cpp作为后缀的(cpp是c plus plus 的缩写)。2. 对源程序进行编译为了使计算机能执行高级语言源程序,必须先用一种称为“编译器(complier)”的软件(也称编译程序或编译系统),把源程序翻译成二进制形式的“目标程序(object program)”。编译是以源程序文件为单位分别编译的。目标程序一般以.obj或.o作为后缀(object 的缩写)。编译的作用是对源程序进行词法检查和语法检查。编译时对文件中的全部内容进行检查,编译结束后会显示出所有的编译出错信息。一般编译系统给出的出错信息分为两种,一种是错误(error);一种是警告(warning) 。3. 将目标文件连接在改正所有的错误并全部通过编译后,得到一个或多个目标文件。此时要用系统提供的“连接程序(linker)”将一个程序的所有目标程序和1.5 关于C++上机实践在了解了C++语言的初步知识后,读者最好尽快在计算机上编译和运行C++程序,以加深对C++程序的认识,并初步掌握C++的上机操作。读者可以使用不同的C++编译系统,在不同的环境下编译和运行一个C++程序。但是需要强调的是,我们学习的是C++程序设计,应当掌握的是标准C++,而不应该只了解某一种“方言化”的C++。不应当只会使用一种C++编译系统,只能在一种环境下工作,而应当能在不同的C++环境下运行自己的程序,并且了解不同的C++编译系统的特点和使用方法,在需要时能将自己的程序方便地移植到不同的平台上。在本书的参考书《C++程序设计题解与上机指导》一书中简单介绍了在Visual C++ 6.0和GCC两种典型的环境下运行C++程序的方法。请读者选择一种(如能做到两种更好) C++编译系统,在该环境下输入和运行习题中的程序,掌握上机的方法和步骤。。

c语言程序设计谭浩强第五版

c语言程序设计谭浩强第五版

c语言程序设计谭浩强第五版
C语言程序设计是谭浩强写的一本基础类教材。

本书用通俗易懂的语言阐述了C语言的基本知识,旨在帮助学习者成为C语言的使用者。

该书也以学习C语言的实践情况为基础,深入浅出地讲解了C语言的知识,使学习者对C语言有一个全面而清晰的认识。

本书有十一个章节。

第一章介绍了C语言的发展历史,以及C语言作为程序设计语言的优点。

第二章介绍C语言的基本概念,包括程序设计的概念、C语言程序构成要素以及程序语言语法等。

第三章介绍了数据类型,讲解C语言中变量的种类,以及与各种数据类型的相互关系。

第四章着重讲解了程序设计语言的结构,以基本的C语言指令为主题,包括循环与选择语句、函数、指针访问以及单元数据管理等内容;第五章详细讲解用结构体及其语法来管理数据;第七、八章介绍了图形图像以及多线程程序设计等高级概念;最后的章节则用示例程序介绍了C语言的应用。

这本书简要而易懂,又兼顾广度和深度,既能帮助学习者掌握基础的C语言知识又能引导着深入学习C语言的高级技术。

它的内容也不会过时,可以长期使用做资料参考。

C语言谭浩强完整课件

C语言谭浩强完整课件

着广泛的应用。
计算机系统基本概念
计算机系统的组成
计算机系统由硬件系统和软件系统两大部分组成,硬件系统包括运算器、控制器、存储器 、输入设备和输出设备等五大部分;软件系统包括系统软件和应用软件两大类。
计算机的工作原理
计算机的工作原理可以概括为存储程序控制和程序控制流,即计算机通过执行存储在内存 中的程序来控制各部件协调工作。
在定义数组时,可以直接 对数组进行初始化,也可 以定义后再进行赋值。
一维数组的使用
通过下标访问数组元素, 下标从0开始,最大下标为 数组长度减1。
二维数组与多维数组
二维数组的定义
二维数组可以看作是一个 表格,由行和列组成,每 个元素都有两个下标。
二维数组的初始化
在定义二维数组时,可以 直接对数组进行初始化, 也可以定义后再进行赋值 。
scanf和printf函数都支持 格式化输入输出,可以通 过格式控制符指定输入输 出数据的类型和格式。
格式化输入
格式控制符
C语言提供了一组格式控制符,用于 指定输入输出数据的类型和格式,如 %d表示输入输出整数,%f表示输入 输出浮点数等。
格式化输入
格式化输出
使用printf函数进行格式化输出时, 可以指定输出数据的格式和显示方式 ,如控制小数位数、显示宽度等。
类型。
枚举常量的说明
在枚举类型定义中,可以列 出多个枚举常量,每个常量 对应一个整数值。默认情况 下,第一个枚举常量的值为0 ,后续常量的值依次递增1。
枚举变量的使用
声明枚举类型的变量后,可 以为其赋值。枚举变量的值 只能是枚举常量中定义的值 。使用枚举类型可以提高代 码的可读性和可维护性。
08
文件操作与数据处理

c语言程序设计谭浩强第二版

c语言程序设计谭浩强第二版

《C语言程序设计》是一本由谭浩强教授编写的经典教材,第二版于2010年出版。

这本书在中国计算机教育界具有广泛的影响力,被誉为“中国计算机教育的经典教材”之一。

本书分为11章,全面介绍了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语言的高级特性,包括动态内存分配、文件操作、结构体和共用体等。

C语言应用则介绍了C 语言在实际应用中的一些技巧和方法,例如C语言与汇编语言的混合编程、多线程编程和网络编程等。

本书的特点是注重实践与理论相结合,既有丰富的例子和示例程序,又有详细的讲解和解释,让读者能够更加深入地理解C语言的各个方面,并掌握具体的编程技能。

此外,本书也注重培养读者的编程思维和解决问题的能力,通过许多编程实例,激发读者的创造力和探索精神。

值得一提的是,本书讲解清晰,语言易懂,节奏明快,即使对于没有任何编程基础的读者来说,也能够轻松地入门,掌握基本语法和编程思想。

对于有一定编程基础的读者来说,本书也能够提供更加深入、全面的学习体验。

总之,《谭浩强C语言程序设计》是一本非常优秀的C语言教材,无论是初学者还是有经验的程序员,都能够从中受益匪浅。

通过学习这本书,读者可以掌握C语言的基本语法和编程思想,提高自己的编程技能,进一步深入学习计算机科学和软件工程等领域。

谭浩强教材的勘误

谭浩强教材的勘误

谭浩强教材的勘误:
谭浩强编写的教材《C程序设计》(第四版)确实存在一些错误和不准确之处。

以下是一些常见的勘误和需要注意的问题:
1.变量类型定义错误:在某些情况下,谭浩强教授将变量定义为int型,但在实际应用
中应该使用float或double型。

这可能会导致计算结果不准确或产生意外的错误。

2.函数参数错误:在函数定义中,谭浩强教授有时会错误地将函数参数设置为常量,
而不是变量。

这会导致函数无法正确地修改参数的值。

3.语法错误:在代码示例中,有时会出现语法错误,例如括号不匹配或缺少分号。


些错误可能会导致编译失败或程序运行异常。

4.逻辑错误:在算法实现中,有些逻辑关系不正确,导致程序无法按照预期的方式运
行。

例如,条件语句的逻辑判断不准确或循环的次数不对。

5.代码可读性差:虽然谭浩强教授的教材中提供了许多代码示例,但有些代码可读性
较差,缺乏注释和说明。

这使得读者难以理解代码的功能和工作原理。

上海交通大学C++课程课件_1-9章

上海交通大学C++课程课件_1-9章

程序注释
预处理命令
int main() { std::cout << “hello everyone” << std::endl; return 0; }
主程序
程序设计 - 11
《程序设计》 cs.sjtu 2011.9
编译预处理


C++的编译分成两个阶段:预编译和编译
预编译处理程序中的预编译命令,即那些以#
程序的组成

变量定义:C++中的变量在使用前都必须被定义。变
量定义严格指出变量中可以存放的数据类型。 输入阶段 :获取执行时才能确定的用户数据。输入

过程一般包括两步 :
显示提示信息 读取数据

计算阶段 :由输入推导出输出的过程。通常通过各 种计算得到。 输出阶段:显示程序执行的结果
程序设计 - 25



在C++中,每个变量在使用前必须被定义,以便编译器 检查变量使用的合法性。 程序设计 - 27
变量命名

《程序设计》 cs.sjtu 2011.9
名字必须以字母或下划线开头。C++语言中,名字中出 现的大写和小写字母被看作是不同的字符,因此ABC, Abc,abc是三个独立的变量名。 名字中的其它字符必须是字母、数字或下划线,不得使 用空格或其它特殊符号 名字不可以是系统的保留词,如:int, double, for, return 等,它们在C++语言中有特殊用途
#include <iostream> using namespace std; int main() { cout << ‚Hello world.‛ << endl; return 0; }

上海交大参考书目

上海交大参考书目

上海交大参考书目上海交通大学是一所综合性研究型大学,涵盖多个学科领域。

以下是一些常见的上海交通大学参考书目的例子,具体的参考书目可以根据你所学的专业和课程要求进行调整:1. 《机器学习》(Machine Learning)- Tom Mitchell2. 《计算机网络:自顶向下方法》(Computer Networking: A Top-Down Approach)- James F. Kurose, Keith W. Ross3. 《数据结构与算法分析:C语言描述》(Data Structures and Algorithm Analysis in C)- Mark Allen Weiss4. 《模拟电子技术基础》- Adel S. Sedra, Kenneth C. Smith5. 《微积分》(Calculus)- James Stewart6. 《电路理论与基础电子技术》- Charles K. Alexander, Matthew N.O. Sadiku7. 《信号与系统》(Signals and Systems)- Alan V. Oppenheim, Alan S.Willsky, S.Hamid Nawab8. 《线性代数及其应用》(Linear Algebra and its Applications)- David C. Lay, Steven R. Lay, Judi J. McDonald9. 《数字电子技术与应用》- William Kleitz10. 《软件工程:实践者的研究方法》(Software Engineering:A Practitioner's Approach)- Roger S. Pressman这只是一些常见的参考书籍,具体的参考书目还取决于你所学的专业和课程要求。

建议你可以向你的课程老师或学院的指导下寻求更具体的建议。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
函数,其中一个无 参数,一个有参数。
#include <iostream> using namespace std; class Box {public: Box( ); //声明一个无参的构造函数 Box(int h,int w,int len):height(h),width(w),length(len){ } //声明一个有参的构造函数,用参数的初始化表对数据成员初始化 int volume( ); private: int height; int width; int length; }; Box∷Box( ) //定义一个无参的构造函数 {height=10; width=10; length=10; }
这种写法方便、简练,尤其当需要初始化的数据成员较多 时更显其优越性。甚至可以直接在类体中(而不是在类外)定 义构造函数。
9.1.5 构造函数的重载
在一个类中可以定义多个构造函数,以便对类对象 提供不同的初始化的方法,供用户选用。这些构造 函数具有相同的名字,而参数的个数或参数的类型 不相同。这称为构造函数的重载。 通过下面的例子可以了解怎样应用构造函数的重载。

例9.5 包含构造函数和析构函数的C++程序。 #include<string> #include<iostream> using namespace std; class Student //声明Student类 {public: student(int n,string nam,char s ) //定义构造函数 {num=n; name=nam; sex=s; cout<<″Constructor called.″<<endl; //输出有关信息 } ~Student( ) //定义析构函数 {cout<<″Destructor called.″<<endl;} //输出有关信息 void display( ) //定义成员函数 {cout<<″num: ″<<num<<endl; cout<<″name: ″<<name<<endl; cout<<″sex: ″<<sex<<endl<<endl; }
#include <iostream> using namespace std; class Box {public: Box(int h=10,int w=10,int len=10); //在声明构造函数时指定默认参数 int volume( ); private: int height; int width; int length; }; Box∷Box(int h,int w,int len) //在定义函数时可以不指定默认参数 {height=h; width=w; length=len; }
} //程序运行结果为:The volume of box1 is 1000
The volume of box2 is 1500 The volume of box3 is 4500 The volume of box4 is 9000
9.2 析构函数
析构函数(destructor)也是一个特殊的成员函数,它的作 用与构造函数相反,它的名字是类名的前面加一个“~”符 号。 当对象的生命期结束时,会自动执行析构函数。具体地说 如果出现以下几种情况,程序就会执行析构函数: ①如果在一个函数中定义了一个对象(它是自动局部对象), 当这个函数被调用结束时,对象应该释放,在对象释放前自 动执行析构函数。 ② 如果定义了一个全局对象,则在程序的流程离开其作用 域时(如main函数结束或调用exit函数) 时,调用该全局对象 的析构函数。 ③如果用new运算符动态地建立了一个对象,当用delete运 算符释放该对象时,先调用该对象的析构函数。它撤销对象 占用的内存之前完成一些清理工作,使这部分内存可以被程 序分配给新对象使用。
前一页 休息 2
9.1 构造函数
9.1.1 对象的初始化
在建立一个对象时,常常需要作某些初始化的工作, 例如对数据成员赋初值。 如果一个数据成员未被赋值,则它的值是不可预知的, 因为在系统为它分配内存时,保留了这些存储单元的原 状,这就成为了这些数据成员的初始值。 注意: 类的数据成员是不能在声明类时初始化的。
在本程序中定义了两个重载的构造函数,其实还可以定义 其他重载构造函数,其原型声明可以为
Box∷Box(int h); Box∷Box(int h,int w); //有1个参数的构造函数 //有两个参数的构造函数
在建立对象时分别给定1个参数和2个参数。
9.1.6 使用默认参数的构造函数
构造函数中参数的值既可以通过实参传递,也可以指定为 某些默认值,即如果用户不指定实参值,编译系统就使形 参取默认值。
int main( ) { Box box1(12,25,30); //建立对象box1,并指定box1长、宽、高的值 cout<<″The volume of box1 is ″<<box1.volume( )<<endl; Box box2(15,30,21); //建立对象box2,并指定box2长、宽、高的值 cout<<″The volume of box2 is ″<<box2.volume( )<<endl; return 0; }

析构函数不返回任何值,没有函数类型,也没有函数参数。 它不能被重载。一个类可以有多个构造函数,但只能有一个 析构函数。 一般情况下,类的设计者应当在声明类的同时定义析构函数, 以指定如何完成“清理”的工作。 如果用户没有定义析构函数,C++编译系统会自动生成一个 析构函数,但它只是徒有析构函数的名称和形式,实际上什么 操作都不进行。 想让析构函数完成任何工作,都必须在定义的析构函数中指 定。
9.1.3 带参数的构造函数
如果用户希望对不同的对象赋予不同的初值。 可以采用带参数的构造函数,在调用不同对象 的构造函数时,从外面将不同的数据传递给构造 函数,以实现不同的初始化。

例9.2 有两个长方柱,其长、宽、高分别为: (1)12,20,25; (2)10,14,20。求它们的体积。
成员初始化
C++还提供另一种初始化数据成员的方法——参数初 始化表来实现对数据成员的初始化。这种方法不在函数体 内对数据成员初始化,而是在函数首部实现。例如例9.2中 定义构造函数可以改用以下形式:
Box∷Box(int h,int w,int len):height(h),width(w),length(len){ }
#include <iostream> using namespace std; class Box {public: Box(int,int,int); //声明带参数的构造函数 int volume( ); //声明计算体积的函数 private: int height; int width; int length; }; Box∷Box(int h,int w,int len) //在类外定义带参数的构造函数 { height=h; width=w; length=len; } int Box∷volume( ) //定义计算体积的函数 { return(height*width*length); }

9.1.2 构造函数的作用

C++提供了构造函数(constructor)来处理对象的初始化。 构造函数是一种特殊的成员函数,与其他成员函数不同, 不需要用户来调用它,而是在建立对象时自动执行。 构造函数的名字必须与类名同名,而不能由用户任意命 名,以便编译系统能识别它并把它作为构造函数处理。 它不具有任何类型,不返回任何值。构造函数的功能是由 用户定义的,用户根据初始化的要求设计函数体和函数参 数。
int Box∷volume( ) {return(height*width*length); } int main( ) { Box box1; //没有给实参 cout<<″The volume of box1 is ″<<box1.volume( )<<endl; Box box2(15); //只给定一个实参 cout<<″The volume of box2 is ″<<box2.volume( )<<endl; Box box3(15,30); //只给定2个实参 cout<<″The volume of box3 is ″<<box3.volume( )<<endl; Box box4(15,30,20); //给定3个实参 cout<<″The volume of box4 is ″<<box4.volume( )<<endl; return 0;
int Box∷volume( ) {return(height*width*length); } int main( ) { Box box1; //建立对象box1,不指定实参 cout<<″The volume of box1 is ″<<box1.volume( )<<endl; Box box2(15,30,25); //建立对象box2,指定3个实参 cout<<″The volume of box2 is ″<<box2.volume( )<<endl; return 0; }
例9.1 在例8.3基础上定义构造成员函数。
#include <iostream> using namespace std; class Time {public: Time( ) //定义构造成员函数,函数名与类名相同 {hour=0; //利用构造函数对对象中的数据成员赋初值 minute=0; sec=0; } void set_time( ); //函数声明 void show_time( ); //函数声明 private: int hour; //私有数据成员 int minute; int sec; };
相关文档
最新文档