欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > DOCX文档下载  

    c++语言程序设计教程习题解答 沈显军 杨进才 张勇.docx

    • 资源ID:3153754       资源大小:50.18KB        全文页数:23页
    • 资源格式: DOCX        下载积分:6.99金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要6.99金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    c++语言程序设计教程习题解答 沈显军 杨进才 张勇.docx

    c+语言程序设计教程习题解答 沈显军 杨进才 张勇1.1 习题1解答 1. 机器语言是计算机直接理解执行的语言,由一系列指令组成,其助符构成了汇编语言;接近人的自然语言习惯的程序设计语言为高级语言。 结构化程序设计方法主要内容有:自顶向下,逐步求精;面向对象方法将现实世界中的客观事物描述成具有属性和行为的对象,抽象出共同属性和行为,形成类。 C+程序开发通常要经过5个阶段,包括:编辑,编译,连接,运行,调试。首先是编辑阶段,任务是编辑源程序,C+源程序文件通常带有.cpp扩展名。接着,使用编译器对源程序进行编译,将源程序翻译为机器语言代码,过程分为词法分析、语法分析、代码生成3个步骤。 在此之前,预编译器会自动执行源程序中的预处理指令,完成将其他源程序文件包括到要编译的文件中,以及执行各种文字替换等。 连接器的功能就是将目标代码同缺失函数的代码连接起来,将这个“漏洞”补上,生成可执行文件。程序运行时,可执行文件由操作系统装入内存,然后CPU从内存中取出程序执行。若程序运行进程中出现了错误,还在需要对程序进行调试。 对象与对象之间通过消息进行相互通信。 类是具有相同属性和行为的一组对象的抽象;任何一个对象都是某个类的一个实例。 多态性是指在一般类中定义 的属性或行为,被特殊类继承之后,可以具有不同的数据类型或表现出不同的行为。 面向对象的软件开发过程主要包括面向对象的方法分析、面向对象的设计、面向对象的编程、面向对象的测试和面向对象的维护。 泛型程序设计是指在程序设计时,将数据类型参数化,编写具有通用性和可重用的程序。 # include <iostream>是一条预处理指令,在编译时由编译器执行,其功能是将iostream文件包含到指令处。 C+中使用cin作为标准输入流对象,通常代表键盘,与提取操作符>>连用;使用cout作为标准输出流对象,通常代表显示设备,与<<连用。 2. 叙述机器语言、汇编语言、高级语言的特点。 机器语言是计算机直接执行的语言,由二进制的和构成的一系列指令组成; 汇编语言是机器语言的助记符; 高级语言是接近人的自然语言习惯的编程语言,通过编译变成机器语言。 结构化的语言与面向对象的语言是截然分开的吗? 不是截然分开的,面向对象的程序设计中也包含过程,含有结构化的思想。 C编写的程序不加修改就可以在C+编译器中编译。 C+程序通过编译变成带扩展名.obj的目标文件;再通过连接变成带扩展名.exe的可执行文件。 如果要求不使用include包含头文件,有什么办法使程序正常编译运行? 在相应的文件夹中,找到需要包含的头文件,将头文件复制到包含处。 3. C+语言程序能够在不同操作系统下编译、运行,说明C+具有良好的移植性。 #include语句在程序运行前就执行了。 C+程序运行时总是起始于main( ); 用C+写程序时一个语句可分几行写。 面向对象编程方法有:对象、继承、类等。 1.2 习题2解答 1. C+的基本数据类型可分为5大类:逻辑型、字符型、整形、实型、空值型。分别用关键字bool,char,int,float/double,void 定义。长度分别为,/8,不定字节。整型、字符型的默认符号修饰为signed。 十进制数值、八进制数值、十六进制数值的前缀分别为19, 0, 0x(或0X)。 一个整数值的数据类型为int,一个带小数点的数据类型为double。 C+预定义的常用转义序中,在输出流中用于换行、空格的转义序列分别为n,t。 布尔型数值只有两个;true, false。在C+的算术运算式中,分别当作,。 字符由单引号括起来,字符串由双引号“”括起来。字符只能有个字符字符串可以有多个字符。空串的表示方法为“0”。 标识符以英文字母,下划线开头。 定义变量的同时赋初值的方法有赋值运算符,括号。定义常变量初值的方法有赋值运算符,括号。 关系运算符操作数的类型可以是任何基本数据类型,对其中的实数类型不能进行直接比较 &&与|表达式按从左到右的顺序进行计算,以&&连接的表达式,如果左边的计算结果为false(或),右边的计算不需要进行,就能得到整个逻辑表达式的结果:false;以|连接的表达式,如果左边的计算结果为true(或非),就能得到整个逻辑表达式的结果:true。 >>运算符将一个数右移n位,相当于将该数除以2,<<运算符将一个数左移n位,相当于将该数乘以2。 所有含赋值运算的运算符左边要求是左值。 前置+、的优先级高于后置+、。 按操作数数目分,运算符的优先级从高到低排列为单目、双目、三目,按运算符的性分,优先级从高到低排列为算术、移位、关系、按位、逻辑。 在表达式中会产生副作用的运算符有+、- -、各类赋值。 2. 1.3 习题3解答 1. if语句中的表达式可以是任意表达式。 1.4 习题4解答 1. 一个C+程序就是由一个个函数组成的即使是最简单的程序也有一个main( )函数。 函数执行过程中通过return语句将函数值返回,当一个函数不需要返回值,此时需要使用void作为类型名。 在C+中,如果函数定义在后,调用在先,需要进行函数原型声明,告诉编译器函数的类型,函数名,形式参数。其格式和定义函数时的函数头的形式基本相同,它必须以分号 ;结尾。 函数调过程的3个步骤为:函数调用,函数体执行,返回。 函数参数传递过程的实质是将实参值通过堆栈一一传送给实参。 递归程序分两个阶段执行调用,回代。 带inline关键字定义的函数为内联函数,在编译时将函数体展开到所有调用处。内联函数的好处是节省执行时间开销。 函数名相同,但对应形参表不同的一组函数称为重载函数,参数表不同是指参数个数、类型不同。 确定对重载函数中函数进行绑定的优先次序为精确匹配,对实参的类型向高类型转换后的匹配,实参类型向低类型及相容类型转换后的匹配。 当既存在重载函数、又有函数模板,函数调用优先绑定重载函数,只有不能精确匹配重载函数时,才实例化类模板。 nN内联函数的展开、重载函数的绑定、类模板的实例化与绑定均在编译阶段进行。 在C+中,函数不允许嵌套定义,允许嵌套调用。 2. void fun(void)的定义是正确的,double fun(int x;int y) 和int fun; 和double fun(int x,y) 这都是不正确的。 函数int fun(int x, int y)的声明形式可以是int fun(int, int)和int fun(int y,int x);和int fun(int i,int j);。 C+语言中规定函数的返回值的类型是由定义该函数时所指定的数据类型所决定。 在C+中默认的形参值应该先从右边的形参开始向左边依次设置。 重载函数参数个数相同时,参数类型必须不同。 系统在调用重载函数时,依据的是函数名称、实参个数、实参类型。 为了取代C中带参数的宏,在C+ 中使用内联函数。 函数模板定义的头部template<class t1,typename t2,int s=0> 若fun(8,3.1)调用的可以是fun(double, double) 若fun(8,3.1)调用的可以是template <class T1, class T2>fun (T1,T2) 1.5 习题解答 1. enum weekday sun,mon,tue,wed=d,thu,fri,sat; weekday workday =mon; cout<<workday+wed<<endl; 输出:5 在C+中,引用数组元素时,其数组下标的数据类型允许是整形常量、整形表达式等非浮点型表达式。 设有数组定义:char array=”China”; 则数组array所占的空间为6个字节。 若:int a3 = 1,2,3,4,5,6,7; 则a 数组高维的大小为:3。 若二维数组a有m 列,则在aij前的元素个数为; 1.6 习题六解答 1 从变量的定义位置分,可分为全局变量与局部变量。其中,局部变量定义在函数或复合语句中,供函数或复合语句中使用。 变量的存储类型分为auto,extern,register,static。当声明一个静态变量,它既具有局部变量的性质,又具有全局变量的性质。 +程序的内存分为个区:全局数据区,代码区,栈区,堆区。全局变量,静态变量,字符串常量存放在全局数据区,所有在函数和代码存放在代码区,为运行函数而分配的函数参数,局部变量,返回地址存放在栈区。动态分配的内存在堆区。 全局变量,静态变量具有静态生存期;局部变量生存期为动态。 函数原型中形参标识符的作用域为为函数原型,函数的形参与函数体作用域为块作用域;函数,全局变量与常量有文件作用域。 +源程序中以#开头,以换行符结尾的行称为预处理命令。预处理命令编译前由预处理器执行。 可以通过种方法使用名字空间,个别使用声明方式,全局声明方式,全局声明个别成员。 2. 在+中,函数默认的存储类别为:auto。 函数的形式参数是局部变量,在一个函数体内定义的变量只在本函数范围内有效,在函数的复合语句中定义的变量在此复合语句中有效。 # define PI 3.14 预处理命令必须以#开头,凡是以#开头的都是预处理命令行,在程序执行前执行预处理命令。 动态分配的内存要用delete释放,局部auto变量分配的内存在函数调用结束时释放,全局变量的内存在程序结束时释放。 1.7 习题7解答 1. 类的私有成员只能被该类的成员函数或友元函数访问。 类的数据成员不能在定义的时候初始化,而应该通过构造函数初始化。 类成员默认的访问方式是private. 类的公有成员函数的集合是该类给外界提供的接口。 类的公有成员可以被类作用域内的任何对象访问。 为了能够访问到某个类的私有成员,必须在该类中声明该类的友元。 类的静态成员为该类的所有对象所共享。 每个对象都有一个指向自身的指针,称为this指针,通过使用它来确定其自身的地址。 运算符new自动建立一个大小合适的对象并返回一个具有正确类型的指针。 +禁止非const成员函数访问const对象。 定义类的动态对象数组时,系统只能够自调用该类的构造函数对其进行初始化。 +中语句const char* const p=”hello”;所定义的指针p和它所指的内容都不能被以改变。 假定AB为一个类,则语句 AB(AB& x);为该类拷贝构造函数原型说明。 在C+中访问一个对象的成员所用的运算符是 . ,访问一个指针所指向的对象的成员所用的运算符是->。 析构函数在对象的生存期结束时被自动调用,全局对象和静态对象的析构函数在程序运行结束时调用。 设p是指向一个类的动态对象的指针变量,则执行 delete P;语句时,将自动调用该类的析构函数。 2. 数据封装就是将一组数据和与这组数据有关操作组装在一起,形成一个实体,这实体也就是类。 类的实例化就是创建类的对象。 已知p是一个指向类Sample数据成员m的指针,s是类Sample的一个对象。如果要给m赋值为:s.*p=5; 类与对象的关系和数据类型与变量的关系是相似的,一个对象只能属于一个具体的类。 封装要求对象就具有明确的功能,它使得一个对象可以像一个部件一样用在各种程序中。 内联函数是在编译时将该函数的目标代码插入到每一个调用该函数的地方。 类中的函数成员可以在类体中定义,也可以在类体之外定义。 +中的对象并不是语言中的结构体变量,它是一个状态和操作的封装体,对象之间的信息传递是通过消息进行的。 在建立类的对象时只为每个对象分配用于保存数据成员的内存 3. 类和数据类型有何关联? 类相当于一种包含函数的自定义数据类型,它不占内存空间,是一个抽象的“虚”体,使用已定义的类建立对象就像用数据类型定义变量一样。对象建立后,对象占据内存,变成了一个“实”体。类与对象的关系就像数据类型与变量的的关系一样。其实,一个变量就是一个简单的不含成员函数的数据对象。 类和对象的内存分配关系? 为节省内存,编译器在创建对象时,只为各对象分配用于保存各对象数据成员初始化的值,并不为各对象的成员函数分配单独的内存空间,而是共享类的成员函数定义,即类中成员函数的定义为该类的所有对象所共享,这是C+编译器创建对象的一种方法,实际应用中,我们仍将对象理解为由数据成员和函数成员两部分组成。 什么是浅拷贝?什么是深拷贝?二者有何异同? 构造函数用于建立对象时给对象赋初值以初始化新建立的对象。如果有一个现存的对象,在建立新对象时希望利用现存对象作为新对象的初值,即用一个已存在的对象去初始化一个新建立的对象。C+提供的拷贝构造函数用于在建立新对象时将已存在的对象的数据成员值复制给新,以初始化新对象。拷贝构造函数在用类的一个对象去初始化该类的另一个对象时调用,以下3种情况相当于用一个已存在的对象去初始化新建立的对象,因此,调用拷贝构造函数: 当用类的一个对象去初始化该类的另一个对象时。 如果函数的形参是类的对象,调用函数时,将对象作为函数实参传递给函数的形参时。 如果函数的返回值是类的对象,函数执行完成,将返回值返回时。 原因在于默认的拷贝构造函数实现的只能是浅拷贝,即直接将原对象的数据成员值依次复制给新对象中对应的数据成员,并没有为新对象另外分配内存资源。这样,如果对象的数据成员是指针,两个指针对象实际上指向的是同一块内存空间。 当类的数据成员中有指针类型时,我们就必须定义一个特定的拷贝构造函数,该拷贝构造函数不仅可以实现原对象和新对象之间的数据成员的复制,而且可以为新的对象分配单独的内存资源,这就是深拷贝构造函数。 什么是this指针? 它的作用是什么? 一个类的成员函数中,有时希望引用调用它的对象,对此,C+采用隐含的this指针来实现。this指针是一个系统预定义的特殊指针,指向当前对象,表示当前对象的地址。系统利用this指针明确指出成员函数当前操作的数据成员所属的对象。实际上,当一个对象调用其成员函数时,编译器先将该对象的地址赋给this指针,然后调用成员函数,这样成员函数对对象的数据成员进行操作时,就隐含使用了this指针。 一般而言,通常不直接使用this指针来引用对象的成员,但在某些少数情况下,可以使用this指针,如重载某些运算符以实现对象的连续赋值等。 This指针不是调用对象的名称,而是指向调用对象的指针的名称。This的值不能改变,它总是指向当前调用对象。 C+中静态成员有何作用?它有何特点? C+提供了静态成员,用以解决同一个类的不同对象之间数据成员和函数的共享问题。 静态成员的特点是:不管这个类创建了多少个对象,其静态成员在内存中只保留一份副本,这个副本为该类的所有对象所共享。 面向对象方法中还有类属性的概念,类属性是描述类的所有对象的共同特征的一个数据项,对于任何对象实像实例,它的属性值是相同的,C+通过静态数据成员来实现类属性。 友元关联有何性质? 友元关联是不能传递的,不能被继承。如B类是A类的友元,C类是B类的友元,C类和A类之间如果没有声明,就没有任何友元关系,不能进行数据共享。 友元关系是单向的,不具有交换性,如果声明B类是A类的友元,B类的成员函数就可以访问A类的私有和保护数据,但A类的成员函数却不能访问B类的私有和保护数据。 在C+程序设计中,友元关系的优点和缺点是什么? 友元概念的引入,提高了数据的共享性,加强了函数与函数之间、类与类之间的相互联系,大大提高了程序的效率,这是友元的优点,但友元也破坏了数据隐蔽和数据封装,导致程序的可维护性变差,给程序的重用和扩充埋下了深深的隐患,这是友元的缺点。 如何实现不同对象的内存空间的分配和释放? 当类被实例化成对象后,不同类别的对象占据不同类型的内存,其规律与普通变量相同: 类的全局对象占有数据段的内存。 类的局部对象内存分配在栈中。 函数调用时为实参建立的临时对象内存分配在栈中。 使用动态内存分配语句new建立的动态对象,内存在堆中分配。 虽然类是由数据成员与成员函数组成。但是,程序运行时,系统只为各对象的数据成员分配单独内存空间,而该类的所有对象则共享类的成员函数定义以及为成员函数分配的空间。对象的内存空间分配有下列规则: 对象的数据成员与成员函数占据不同的内存空间,数据成员的内存空间与对象的 存储类别相关,成员函数的内存空间在代码段中。 一个类所有对象的数据成员拥有各自的内存空间。 一个类所有对象的成员函数为该类的所有对象共享,在内存中,只有一个副本随着对象的生命周期的结束,对象所占的空间就会释放,各类对象内存空间释放时间与方法如下: a 全局对象的数据成员占有的内存空间在程序结束时释放。 b 局部对象与实参对象数据成员的内存空间在函数调用结束时释放。 c 动态对象数据成员的内存空间要使用delete语句释放。 d 对象的成员函数的内存空间在该类的所有对象生命周期结束时自动释放。 1.8 习题解答1 . +程序设计的关键之一是利用继承实现软件重用,有效地缩短程序的开发时间。 基类的对象可以作为派生类的对象使用,这称为类型兼容。 在+中, 三种派生方式的说明符号为public, private, protected, 如果不加说明,则默认的派生方式为private。 当私有派生时,基类的的公有成员成为派生类的私有成员;保护成员成为派生类的私有成员;私有成员成为派生类的不可访问成员。 相互关联的各个类之间的关系主要分为组成关联和继承关联。 在派生类中不能直接访问基类的私有成员否则破坏了基类的封装性。 保护成员具有双重角色,对派生类的成员函数而言,它是公有成员,但对所在类之外定义的其它函数而言则是私有成员。 多继承时,多个基类中的同名的成员在派生类中由于标识符不唯一而出现二义性。在派生类中采用成员名限定或重定义具有二义性的成员来消除该问题。 +提供的多继承机制允许一个派生类继承多个基类。 2. 一个派生类可以作为另外一个派生类的基类;派生类至少有一个基类;派生类的成员除了它自己的成员外,还包含了它的基类的成员。 在多继承中,公有派生和私有派生对于基类成员在派生类中的可访问性与单继承的规则是完全相同的。 友元关系是不能继承的。 派生类一般都是公有派生;对基类成员的访问必须是无二义性的;赋值兼容规则也是适用于多重继承的场合。 基类的保护成员在公有派生中仍然是保护的;基类的保护成员在私有派生中却是私有的;对基类成员的访问必须是无二义性的。 在公有派生的情况下,派生类中定义的成员函数只能访问原基类中的公有成员和保护成员。 每个派生类的构造函数都要为虚基类构造函数提供实参;多继承时有可能出现对基类成员访问的二义性问题;建立派生类对象时,虚基类数的构造函数会首先被调用。 在一个派生类对象结束其生命周期时先调用基类的析构函数后调用派生类的析构函数。 当保护继承时,基类的公有成员和保护成员在派生类中成为保护成员,不能通过派生类的对象来直接访问。 若派生类的成员函数不能直接访问基类中继承来的某个成员,则该成员一定是基类中的私有成员。 设置虚基类的目的是消除二义性。 继承具有传递性,即当基类本身也是某个类的派生类时,底层的派生类也会自动继承间接基类的成员。 在派生类构造函数的初始化列表中不能包含派生类中一般数据成员的初始化。 在公有派生情况下,派生类的对象可以赋给基类的对象;派生类的对象可以初始化基类的引用;派生类的对象的地址可以赋给指向基类的指针。 3. 派生类如何实现对基类私有成员的访问? 无论使用哪一种继承方式,基类的私有成员都不允许外部函数直接访问,也不允许派生的成员函数直接访问,但是可以通过基类的公有成员函数间接访问该类的私有成员。 什么是赋值兼容?它会带来什么问题? 类型兼容是指在公有派生的情况下,一个派生类对象可以作为基类的对象来使用。类型兼容又称为类型赋值值兼容或类型适应。 在C+中,类型兼容主要指以下3种情况: 派生类对象可以赋值给基类对象; 派生类对象可以初始化基类的引用; 派生类对象的地址可以赋给指向基类的指针; 由于派生类对象中包含基类子对象,所以这种引用方式是安全的,但是这种方法只能引用从基类继承的成员。如果试图通过基类指针引用那些只有在派生类中才有的成员,编译器将会报告语法错误。 多重继承时,构造函数和析构函数的执行顺序是如何实现的? 多得继承时,构造函数的执行顺序是:先执行基类的构造函数,再执行对象成员的构造函数,最后执行派生类的构造函数。 在多个基类之间则严格按照派生类声明时从左到右的顺序来执行各基类的构造函数,而析构函数的执行顺序则正好与构造函数的执行顺序相反。 继承与组合之间的区别和联系是什么? 继承描述的是一般类与特殊类的关系,类与类之间体现的是”is a kind of”,即如果在逻辑上A是B的一种,允许A继承B的功能和属性。例如汽车是交通工具的一种,小汽车是汽车的一种。那么类automobile可以从类vehicle派生,类car 可以从类automobile派生。 组合描述的是整体与部分的关系,类与类之间体现的是”is a part of ”,如果在逻辑上A是B的一部分,则允许A和其他数据成员组合为B。例如:发动机、车轮、电池、车门、方向盘、底盘都是小汽车的一部分,它们组合成汽车,而不能说汽车是发动机的一种。 在C+中,类的继承与类的组合很相似,继承和组合既有区别,也有联系,主要表现在描述的关系不同。某些比较复杂的类,既需要使用继承,也需要使用组合,二者一起使用。 在某些情况下,继承与组合的实现还可以互换。在多继承时,一个派生类有多个直接基类,派生类实际上是所有基类属性和行为的组合。派生类是对基类的扩充,派生类的成员一部分是从基类中来,因此派生类组合了基类。既然这样,派生类也可以通过组合类实现。什么时候用继承,什么时候使用组合,要根据问题中类与类之间的具体关系,顺其自然,权衡考虑。 什么是虚基类?它有什么作用? 在多继承中,当派生类的部分或全部直接基类又是从另一个共同基类派生而来时,这些直接基类中从上一级共同基类继承来的成员就拥有相同的名称。在派生类的对象中,同名数据成员在内存中同时拥有多个副本,同一个成员函数会有多个映射,出现二义性,因此,C+将共同基类设置为虚基类。虚基类使得从不同的路径继承过来的同名数据成员在内存中只有一个副本,同一个函数也只有一个映射。这样不公解决了二义性的问题,也节省了内存,避免了数据不一致的问题。 1.9 习题9解答 1. 将一个函数调用链接上相应函数体的代码,这一过程称为联编。 +支持两种多态性:静态多态性和动态多态性。 在编译时就确定的函数调用称为静态联编,它通过使用重载函数实现。 在运行时才确定的函数调用称为动态联编,它通过继承和虚函数来实现。 虚函数的声明方法是在函数原型前加上关键字virtual。 +的静态多态性是通过重载函数实现的。 +的动态多态性是通过虚函数实现的。 当通过基类指针使用虚函数时,+会在与对象关联的派生类中正确地选择重定义的函数。 如果一个类包含一个或多个纯虚函数,则该称为抽象类。 若以非成员函数形式,为类Bounce重载!运算符,其操作结果为bool型数据,则该运算符重载函数的原型是:friend bool operate ! (Bounce); 2. 在+中:运算符不能被重载。 运算符重载不能改变运算数的个数、优先级、结合性和语法结构。 如果表达式+i*k中的+和*都是重载的友元运算符,则采用运算符函数调用格式,该表达式还可表示为operator*(operator+(i),k).。 5.0+2.0和2+5两个表达式中的+的意义不相同。 有的运算符只能作为成员函数重载。 已知在一个类体中包含如下函数原型:VOLUME operator-(VOLUME)const;。 这是运算符的重载运算符函数;这是一个成员函数;这个函数不改变类的任何数据成员的值。 在表达式x+y*z中,+是作为成员函数重载的运算符,*是作为非成员函数重载的运算符。 Operator+有一个参数,operator*有两个参数; 在+中,对象之间的相互通信通过调用成员函数来实现。 Franction operator +(Franction,Franction); Franction &operator =(Franction&,Franction); Franction &operator +=(Franction&, Franction)以上是重载为非成员函数的运算符函数原型。 当一个类的某个函数被说明为virtual时,该函数在该类的所有派生类中都是虚函数。 纯虚函数是一个在基类中说明的虚函数,它在该基类中没有定义,但要求在任何派生类都必须定义自己的版本。 Virtual void vf=0; 这个基类中的成员函数表示纯虚函数。 如果一个类至少有一个纯虚函数,那么就称该类为抽象类。 纯虚函数是一种特殊的虚函数,它没有具体的定义;抽象类是指具有纯虚函数的类;抽象类只能作为基类来使用,其纯虚函数的定义同派生类给出。 抽象类的特性不能定义其对象。 抽象类至少应该含有一个纯虚函数。 类是类的公有派生类,类和类中都定义了虚函数 fun, p是一个指向类对象的指针,则p->A::func将调用类中的函数func。 在+中,用于实现运行时多态性的是虚函数。 Class A Public: Virtual void func1 void func2 ; Class B: public A Public: Void func1cout<<”class B func1”<<endl; Virtual void func2 cout<<”class B func2”<<endl; ; 以上代码中:func1是虚函数,而:func2不是虚函数。 抽象类中的成员函数都是虚函数。 如果派生类没有实现基类的一个纯虚函数,则该派生类是一个抽象类。 1.10 习题10解答 1. 模板是面向对象技术提高软件开发效率的重要手段,是+语言的重要特征。 类模板是能根据不同参数建立不同类型成员的类。 中体现了泛型化程序设计的相思,它提倡使用现有的模板程序代码开发应用程序,是一种代码重用技术。 STL(Standard Template Library)是+提供的标准模板库,它可以实现高效的泛型程序设计。 STL容器包括顺序容器和关联容器利用容器适配器可以将顺序容器转换为新的容器。 顺序容器以逻辑线性排列方式存储一个元素序列,在容器类型中的对象在逻辑上跑旱船认为是在连续的存储空间中存储的。 关联容器中的数据元素不存储在顺序的线性数据结构中,它们提供了一个关键字到值的关联映射。 容器适配器就是将某个底层顺序容器转换为另一种容器。即以顺序容器作为数据存储结构,交将其转换为一种某种特定操作特性的新容器。 在STL中,迭代器如同一个特殊的指针。 在STL中函数对象在STL中被广泛用作算法中子操作的参数,使算法变得更加通用。 2. 类模板的使用实际上是将类模板实例化成一个类。 类模板的模板参数能作为数据成员的类型;可作为成员函数的返回类型;可作为成员函数的参数类型。 类模板的实例化在编译时进行。 类模板的参数可以有多个。 类模板实例化时的实参值可以是个。当类模板的模板参数均给出了初值时,类模板实例化时可以没有实例。 类模板的定义:template <class T, int i=0> 类模板: Template <class T1, Class T2 =int, int num=10> Class Tclass 正确的实例化方式为:Tclass <char &, char >C!; 在调用模板函数时模板实参的使用:对于常规参数所对应的模板实参,任何情况下都不能省略。 1.11 习题11解答 1. 标准输入流对象为cin,与>>连用,用于输入;cout为标准输出流对象,与<<连用,用于输出。 用标准输入流对象cin与提取操作>>连用进行输入时,将空格与换行当作分隔符,使用getline成员函数进行输入时可以指定输入分隔符。 头文件iostream中定义了个标准流对象cin, cout, cerr, clog。 每一个输入/输出流对象都维护一个格式状态字,用它表示汉对象当前的格式状态并控制流的格式。+提供了使用操纵符与格式状态字,来控制流的格式的方法。 格式控制的成员函数通过流对象调用;操纵符直接用在流中,但使用函数形式的操纵符要包含iomanip头文件。 在ios类中,除了提供控制数据流格式标志、操纵符、成员函数,还提供了流的错误侦测函数与错误状态位,用于标识流的状态,常用的错误侦测函数有good, eof, fail, bad对应的错误状态位为goodbit, eof, bit, failbit, badbit。 文件输入是指从文件向内读入数据;文件输出则指从内存向文件输出数据。文件的输入输出首先要建立输入文件流,与打开的文件连接;然后从文件流中读入数据到内存;最后关闭文件流。在打开文件、对文件读写时要使用是否成功的判断来保证文件操作的正确。 文本文件是存储ASSCII码字符的文件,文本文件的输入可用>>从输入文件流中提取字符实现。文本文件的输出可用<<将字符插入到输出文件流来实现。 二进制文件是指含ASCII码字符外的数据的文件。二进制文件的输入输出分别采用read、write成员函数,这两个成员函数第一个参数的类型分别为char *, const char *, 如果实参类型不符,分别采用reinterpret_cast<char *>, reinterpret_cast<const char *>进行转换。 设定、返回文件读指针位置的函数分别为seekg, tellg; 设定、返回文件写指针位置的函数分别为seekp, tellp。 2. 要进行文件的输出,除了包含头文件iostream外,还要包含fstream头文件。 char *str; cin>>str; cout<<str; 若输入abcd 1234则输出出错或乱码。 1.12 习题12解答 1. (1) s0是一个string类串,定义串s1的方法有:string s1(s0,0,3); 、string s1(“ABC”,0,3); 、string s1=”ABC”; 、string s1(3,A); (2) 若char *s0=”12345”, 则有:string s1=s0; string s1(s0); string s1(s0,0,3); (3) 求string类串长度的表达式为:S.length; (4) S为string类对象,则S.size; sizeod(S); S.length;的编译不会出错。 (5) S、T为string类对象,则S=T; S1=T1;S+=T;的编译不会出错。 (6) string s=(“ABCDEF”);char *q =”123456”;string:iterator p=s.begin;则有:p=q; *(p+1)=*(q+1); q1=p1; 1.13 习题13解答 1. 运行错属于异常;硬件故障也可当异常抛出;只要是编程者认为是异常的都可以当异常抛出; throw语句必须在try语句块中直接运行或通过调用函数运行;一个程序中可以有try 语句而没有throw语句;throw语句抛出的异常可以不被捕获。 函数声明 float fun(int a, int b) throw,表明函数不抛出任何类型异常。 catch(.)语句可捕获所有类型的异常;一个try语句可以有多个catch语句;程序中try语句与catch语句是一个整体,缺一不可。 若定义int a23, 那么a23=3; 数组下标越界了但不会引发异常。

    注意事项

    本文(c++语言程序设计教程习题解答 沈显军 杨进才 张勇.docx)为本站会员(小飞机)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开