c++语言程序设计教程习题解答 沈显军 杨进才 张勇.docx
《c++语言程序设计教程习题解答 沈显军 杨进才 张勇.docx》由会员分享,可在线阅读,更多相关《c++语言程序设计教程习题解答 沈显军 杨进才 张勇.docx(23页珍藏版)》请在三一办公上搜索。
1、c+语言程序设计教程习题解答 沈显军 杨进才 张勇1.1 习题1解答 1. 机器语言是计算机直接理解执行的语言,由一系列指令组成,其助符构成了汇编语言;接近人的自然语言习惯的程序设计语言为高级语言。 结构化程序设计方法主要内容有:自顶向下,逐步求精;面向对象方法将现实世界中的客观事物描述成具有属性和行为的对象,抽象出共同属性和行为,形成类。 C+程序开发通常要经过5个阶段,包括:编辑,编译,连接,运行,调试。首先是编辑阶段,任务是编辑源程序,C+源程序文件通常带有.cpp扩展名。接着,使用编译器对源程序进行编译,将源程序翻译为机器语言代码,过程分为词法分析、语法分析、代码生成3个步骤。 在此之
2、前,预编译器会自动执行源程序中的预处理指令,完成将其他源程序文件包括到要编译的文件中,以及执行各种文字替换等。 连接器的功能就是将目标代码同缺失函数的代码连接起来,将这个“漏洞”补上,生成可执行文件。程序运行时,可执行文件由操作系统装入内存,然后CPU从内存中取出程序执行。若程序运行进程中出现了错误,还在需要对程序进行调试。 对象与对象之间通过消息进行相互通信。 类是具有相同属性和行为的一组对象的抽象;任何一个对象都是某个类的一个实例。 多态性是指在一般类中定义 的属性或行为,被特殊类继承之后,可以具有不同的数据类型或表现出不同的行为。 面向对象的软件开发过程主要包括面向对象的方法分析、面向对
3、象的设计、面向对象的编程、面向对象的测试和面向对象的维护。 泛型程序设计是指在程序设计时,将数据类型参数化,编写具有通用性和可重用的程序。 # include 是一条预处理指令,在编译时由编译器执行,其功能是将iostream文件包含到指令处。 C+中使用cin作为标准输入流对象,通常代表键盘,与提取操作符连用;使用cout作为标准输出流对象,通常代表显示设备,与运算符将一个数右移n位,相当于将该数除以2,运算符将一个数左移n位,相当于将该数乘以2。 所有含赋值运算的运算符左边要求是左值。 前置+、的优先级高于后置+、。 按操作数数目分,运算符的优先级从高到低排列为单目、双目、三目,按运算符的
4、性分,优先级从高到低排列为算术、移位、关系、按位、逻辑。 在表达式中会产生副作用的运算符有+、- -、各类赋值。 2. 1.3 习题3解答 1. if语句中的表达式可以是任意表达式。 1.4 习题4解答 1. 一个C+程序就是由一个个函数组成的即使是最简单的程序也有一个main( )函数。 函数执行过程中通过return语句将函数值返回,当一个函数不需要返回值,此时需要使用void作为类型名。 在C+中,如果函数定义在后,调用在先,需要进行函数原型声明,告诉编译器函数的类型,函数名,形式参数。其格式和定义函数时的函数头的形式基本相同,它必须以分号 ;结尾。 函数调过程的3个步骤为:函数调用,函
5、数体执行,返回。 函数参数传递过程的实质是将实参值通过堆栈一一传送给实参。 递归程序分两个阶段执行调用,回代。 带inline关键字定义的函数为内联函数,在编译时将函数体展开到所有调用处。内联函数的好处是节省执行时间开销。 函数名相同,但对应形参表不同的一组函数称为重载函数,参数表不同是指参数个数、类型不同。 确定对重载函数中函数进行绑定的优先次序为精确匹配,对实参的类型向高类型转换后的匹配,实参类型向低类型及相容类型转换后的匹配。 当既存在重载函数、又有函数模板,函数调用优先绑定重载函数,只有不能精确匹配重载函数时,才实例化类模板。 nN内联函数的展开、重载函数的绑定、类模板的实例化与绑定均
6、在编译阶段进行。 在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+中默认的形参值应该先从右边的形参开始向左边依次设置。 重载函数参数个数相同时,参数类型必须
7、不同。 系统在调用重载函数时,依据的是函数名称、实参个数、实参类型。 为了取代C中带参数的宏,在C+ 中使用内联函数。 函数模板定义的头部template 若fun(8,3.1)调用的可以是fun(double, double) 若fun(8,3.1)调用的可以是template fun (T1,T2) 1.5 习题解答 1. enum weekday sun,mon,tue,wed=d,thu,fri,sat; weekday workday =mon; coutworkday+wed。 析构函数在对象的生存期结束时被自动调用,全局对象和静态对象的析构函数在程序运行结束时调用。 设p是指向一
8、个类的动态对象的指针变量,则执行 delete P;语句时,将自动调用该类的析构函数。 2. 数据封装就是将一组数据和与这组数据有关操作组装在一起,形成一个实体,这实体也就是类。 类的实例化就是创建类的对象。 已知p是一个指向类Sample数据成员m的指针,s是类Sample的一个对象。如果要给m赋值为:s.*p=5; 类与对象的关系和数据类型与变量的关系是相似的,一个对象只能属于一个具体的类。 封装要求对象就具有明确的功能,它使得一个对象可以像一个部件一样用在各种程序中。 内联函数是在编译时将该函数的目标代码插入到每一个调用该函数的地方。 类中的函数成员可以在类体中定义,也可以在类体之外定义
9、。 +中的对象并不是语言中的结构体变量,它是一个状态和操作的封装体,对象之间的信息传递是通过消息进行的。 在建立类的对象时只为每个对象分配用于保存数据成员的内存 3. 类和数据类型有何关联? 类相当于一种包含函数的自定义数据类型,它不占内存空间,是一个抽象的“虚”体,使用已定义的类建立对象就像用数据类型定义变量一样。对象建立后,对象占据内存,变成了一个“实”体。类与对象的关系就像数据类型与变量的的关系一样。其实,一个变量就是一个简单的不含成员函数的数据对象。 类和对象的内存分配关系? 为节省内存,编译器在创建对象时,只为各对象分配用于保存各对象数据成员初始化的值,并不为各对象的成员函数分配单独
10、的内存空间,而是共享类的成员函数定义,即类中成员函数的定义为该类的所有对象所共享,这是C+编译器创建对象的一种方法,实际应用中,我们仍将对象理解为由数据成员和函数成员两部分组成。 什么是浅拷贝?什么是深拷贝?二者有何异同? 构造函数用于建立对象时给对象赋初值以初始化新建立的对象。如果有一个现存的对象,在建立新对象时希望利用现存对象作为新对象的初值,即用一个已存在的对象去初始化一个新建立的对象。C+提供的拷贝构造函数用于在建立新对象时将已存在的对象的数据成员值复制给新,以初始化新对象。拷贝构造函数在用类的一个对象去初始化该类的另一个对象时调用,以下3种情况相当于用一个已存在的对象去初始化新建立的
11、对象,因此,调用拷贝构造函数: 当用类的一个对象去初始化该类的另一个对象时。 如果函数的形参是类的对象,调用函数时,将对象作为函数实参传递给函数的形参时。 如果函数的返回值是类的对象,函数执行完成,将返回值返回时。 原因在于默认的拷贝构造函数实现的只能是浅拷贝,即直接将原对象的数据成员值依次复制给新对象中对应的数据成员,并没有为新对象另外分配内存资源。这样,如果对象的数据成员是指针,两个指针对象实际上指向的是同一块内存空间。 当类的数据成员中有指针类型时,我们就必须定义一个特定的拷贝构造函数,该拷贝构造函数不仅可以实现原对象和新对象之间的数据成员的复制,而且可以为新的对象分配单独的内存资源,这
12、就是深拷贝构造函数。 什么是this指针? 它的作用是什么? 一个类的成员函数中,有时希望引用调用它的对象,对此,C+采用隐含的this指针来实现。this指针是一个系统预定义的特殊指针,指向当前对象,表示当前对象的地址。系统利用this指针明确指出成员函数当前操作的数据成员所属的对象。实际上,当一个对象调用其成员函数时,编译器先将该对象的地址赋给this指针,然后调用成员函数,这样成员函数对对象的数据成员进行操作时,就隐含使用了this指针。 一般而言,通常不直接使用this指针来引用对象的成员,但在某些少数情况下,可以使用this指针,如重载某些运算符以实现对象的连续赋值等。 This指针
13、不是调用对象的名称,而是指向调用对象的指针的名称。This的值不能改变,它总是指向当前调用对象。 C+中静态成员有何作用?它有何特点? C+提供了静态成员,用以解决同一个类的不同对象之间数据成员和函数的共享问题。 静态成员的特点是:不管这个类创建了多少个对象,其静态成员在内存中只保留一份副本,这个副本为该类的所有对象所共享。 面向对象方法中还有类属性的概念,类属性是描述类的所有对象的共同特征的一个数据项,对于任何对象实像实例,它的属性值是相同的,C+通过静态数据成员来实现类属性。 友元关联有何性质? 友元关联是不能传递的,不能被继承。如B类是A类的友元,C类是B类的友元,C类和A类之间如果没有
14、声明,就没有任何友元关系,不能进行数据共享。 友元关系是单向的,不具有交换性,如果声明B类是A类的友元,B类的成员函数就可以访问A类的私有和保护数据,但A类的成员函数却不能访问B类的私有和保护数据。 在C+程序设计中,友元关系的优点和缺点是什么? 友元概念的引入,提高了数据的共享性,加强了函数与函数之间、类与类之间的相互联系,大大提高了程序的效率,这是友元的优点,但友元也破坏了数据隐蔽和数据封装,导致程序的可维护性变差,给程序的重用和扩充埋下了深深的隐患,这是友元的缺点。 如何实现不同对象的内存空间的分配和释放? 当类被实例化成对象后,不同类别的对象占据不同类型的内存,其规律与普通变量相同:
15、类的全局对象占有数据段的内存。 类的局部对象内存分配在栈中。 函数调用时为实参建立的临时对象内存分配在栈中。 使用动态内存分配语句new建立的动态对象,内存在堆中分配。 虽然类是由数据成员与成员函数组成。但是,程序运行时,系统只为各对象的数据成员分配单独内存空间,而该类的所有对象则共享类的成员函数定义以及为成员函数分配的空间。对象的内存空间分配有下列规则: 对象的数据成员与成员函数占据不同的内存空间,数据成员的内存空间与对象的 存储类别相关,成员函数的内存空间在代码段中。 一个类所有对象的数据成员拥有各自的内存空间。 一个类所有对象的成员函数为该类的所有对象共享,在内存中,只有一个副本随着对象
16、的生命周期的结束,对象所占的空间就会释放,各类对象内存空间释放时间与方法如下: a 全局对象的数据成员占有的内存空间在程序结束时释放。 b 局部对象与实参对象数据成员的内存空间在函数调用结束时释放。 c 动态对象数据成员的内存空间要使用delete语句释放。 d 对象的成员函数的内存空间在该类的所有对象生命周期结束时自动释放。 1.8 习题解答1 . +程序设计的关键之一是利用继承实现软件重用,有效地缩短程序的开发时间。 基类的对象可以作为派生类的对象使用,这称为类型兼容。 在+中, 三种派生方式的说明符号为public, private, protected, 如果不加说明,则默认的派生方式
17、为private。 当私有派生时,基类的的公有成员成为派生类的私有成员;保护成员成为派生类的私有成员;私有成员成为派生类的不可访问成员。 相互关联的各个类之间的关系主要分为组成关联和继承关联。 在派生类中不能直接访问基类的私有成员否则破坏了基类的封装性。 保护成员具有双重角色,对派生类的成员函数而言,它是公有成员,但对所在类之外定义的其它函数而言则是私有成员。 多继承时,多个基类中的同名的成员在派生类中由于标识符不唯一而出现二义性。在派生类中采用成员名限定或重定义具有二义性的成员来消除该问题。 +提供的多继承机制允许一个派生类继承多个基类。 2. 一个派生类可以作为另外一个派生类的基类;派生类
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- c+语言程序设计教程习题解答 沈显军 杨进才 张勇 c+ 语言程序设计 教程 习题 解答
链接地址:https://www.31ppt.com/p-3153754.html