第 1 章习题答案名词解释抽象:抽象(Abstract)就是忽略事物中与当前目标无关的非本质特征,而强调与当前目标有关的本质特征,从而找出事物的共性,并把具有共性的事物划为一类。
面向对象方法中的抽象,是指对具体问题(对象)进行概括,抽出一类对象的公共性质并加以描述的过程。
封装:面向对象方法中的封装就是把将抽象出来的对象的属性和行为结合成一个独立的单位,并尽可能隐蔽对象的内部细节。
消息:消息是面向对象程序设计用来描述对象之间通信的机制。
一个消息就是一个对象要求另一个对象实施某种操作的一个请求。
填空题(1) 面向过程的结构化程序设计方法面向对象程序设计方法(2) 顺序选择循环(3) 程序=数据结构+算法程序=对象+消息(4) 过程类(5) 抽象性封装性继承性多态性选择题(1) B (2) C (3) D (4) C (5) D (6) A (7) A (8) B C (9) A D判断题(1) t (2) f (3) f (4)f (5) t (6) f (7) f (8) t简答题(1) 结构化程序设计方法着眼于系统要实现的功能,从系统的输入和输出出发,分析系统要做哪些事情,进而考虑如何做这些事情,自顶向下地对系统的功能进行分解,来建立系统的功能结构和相应的程序模块结构,有效地将一个较复杂的程序系统设计任务分解成许多易于控制和处理的子任务,便于开发和维护。
随着程序规模与复杂性的增长,这种面向过程的结构化程序设计方法存在明显的不足之处。
首先是数据安全性问题,由于数据被每个模块所共用,因此是不安全的,一旦出错,很难查明原因。
其次是可维护性及可重用性差,它把数据结构和算法分离为相互独立的实体,一旦数据结构需要改变时,常常要涉及整个程序,修改工作量极大并容易产生新的错误。
每一种相对于老问题的新方法都要带来额外的开销。
另外,图形用户界面的应用程序,很难用过程来描述和实现,开发和维护也都很困难。
(2) 面向对象的程序设计方法中,将程序设计为一组相互协作的对象(Object)而不是一组相互协作的函数。
在程序中,属性用数据表示,用来描述对象静态特征;行为用程序代码实现,用来描述对象动态特征。
可见,在面向对象的程序设计方法中,对象是数据结构和算法的封装体。
对象之间存在各种联系,它们之间通过消息进行通信。
程序可表示为:程序=对象+消息在面向对象程序设计中,它着重于类的设计。
类正是面向对象语言的基本程序模块,通过类的设计,来完成实体的建模任务。
类通过一个简单的外部接口,与外界发生关系。
一个类中的操作不会处理到另一个类中的数据,这样程序模块的独立性、数据的安全性就有了良好的保障。
程序的执行取决于事件发生的顺序,由顺序产生的消息来驱动程序的执行。
不必预先确定消息产生的顺序,更符合客观世界的实际。
并且面向对象程序设计方法提供了软件重用、解决大问题和复杂问题的有效途径,具有抽象性、封装性、继承性和多态性等特点。
(3) 结构化程序设计方法中,把数据结构和算法分离为相互独立的实体。
在面向对象程序设计中,数据结构和算法是封装在一起,结合成一个独立的单位,即对象,并尽可能隐蔽对象的内部细节。
对象的私有属性只能由这个对象的行为来读取和修改,与外部的联系通过公有行为充当外部接口。
第 2 章习题答案名词解释引用:所谓引用,就是给对象起一个别名,使用该别名可以存取该对象。
换句话说,是使新对象和原对象共用一个地址。
内联函数:内联函数是使用inline 关键字声明一个函数。
重载函数:重载函数通常用来对具有相似行为而数据类型不同的操作提供—个通用的名称。
填空题(1) 函数类(2) // /*……*/(3) iostream(4) cin >>(5) cout<<(6) 地址值类型值(7)& 对象(8) 声明(9) 值传递引用传递(10) inline(11) new delete(12) x= 10, y=10 x= 100 , y=100选择题(1) A (2)C (3) C (4) A (5) D (6) D (7) D (8) B C (9) A (10) D判断题(1) t (2) f (3) f (4)t (5) t (6) t (7) t (8) t简答题(1) 名字空间用来防止命名的冲突。
(2) 除了独立引用外,在C++程序中,引用的主要用途是用作函数参数和函数的返回值。
(3) 在值传递机制中,作为实参的表达式的值被复制到由对应的形参名所标识的一个对象中,作为形参的初始值。
函数体对形参的访问、修改都是在这个标识对象上操作,与实参无关,即数据的传递是单向的。
使用引用作函数的形参时,调用函数的实参要用变量名。
实参传递给形参,相当于在被调用函数中使用了实参的别名。
于是,在被调用函数中对形参的操作,实质是对实参的直接操作,即数据的传递是双向的。
(4) 内联函数是使用inline 关键字声明一个函数。
在程序编译时,编译系统将程序中出现内联函数调用的地方用函数体进行替换,进而减少了时间开销。
使用内联函数应注意:递归函数不能定义为内联函数。
内联函数一般适合于不含有switch 和while 等复杂的结构且只有1~5 条语句的小函数,否则编译系统将该函数视为普通函数。
内联函数只能先定义后使用,否则编译系统也将该函数视为普通函数。
对内联函数也不能进行异常接口声明。
(5) 不必一致。
所有的参数是根据位置和类型而不是名字来区分的。
(6) 编译系统将根据函数参数的类型和个数来判断使用哪一个函数。
程序分析题(写出程序的输出结果,并分析结果)程序的输出结果:num=60 ref=100程序设计题//xiti2_1.cpp#include#includeusing namespace std;int main(){ float x,y; cout<<"please input 2 floats to x,y:"<>x>>y; float z=pow(x,y);cout<<"pow("<<<""<<<")="<<t类实际上由一个类定义的类型称为类类型,程序员可以使用这个新类型在程序中声明新的变量,具有类类型的变量称为对象。
创建对象时,类被用作样板,对象称为类的实例。
(2) 定义类一般形式为:class 类名{ public:< 公有数据和函数> protected:< 保护数据和函数> private:< 私有数据和函数> }; 访问权限共有三种:分别是公有(public)、保护(protected)和私有(private)的。
(3) 指创建类的对象。
(4) this 指针是C++为成员函数提供的一个隐含对象指针,它不能被显式声明。
this 指针是一个局部量,局部于某个对象。
不同的对象调用同一个成员函数时,编译器根据this 指针来确定应该引用哪一个对象的数据成员。
(5) 拷贝构造函数是一种特殊的构造函数,它的作用是用一个已经存在的对象去初始化另一个对象时。
为了保证所引用的对象不被修改,通常把引用参数声明为const 参数。
在以下 3 种情况下,拷贝构造函数都会被自动调用:①当用类的一个对象去初始化该类的另一个对象时。
②当函数的形参是类的对象,进行形参和实参结合时。
③当函数的返回值是类的对象,函数执行完成返回调用者时。
程序分析题(1) Init defa Init defa Init 15(2) Exit main dst 5(3) Default constructor of Part Constructor of Part,3 Default constructor of Part Constructor of Whole Destructor of Whole Destructor of Part,0 Destructor of Part,3 Destructor of Part,0(4) 30程序设计题(1) //xiti3_1.cpp#include< iostream >using namespace std;class Circle { public: Circle(float r){ radius = r; }~ Circle( ) {} float area() { return 3.14 * radius * radius; } private: float radius; };int main( ){ float r; cout<< “请输入圆的半径:”;cin >> r; Circle p(r);cout<< “半径为”<< r<< “的圆的面积为:”<< p. area ()<< endl; return 0; }(2) //xiti3_2.cpp#includeusing namespace std;class Book { public: Book(int w);static int sumnum;static int getsum(){return sumnum;} private: int num; }; Book: :Book(int w) { num=w; sumnum-=w; }int Book::sumnum=120; int main() { Book b1(20); Book b2(70); cout<<成员。
在类外部,派生类的对象无法访问基类的所有成员。
当类的继承方式为保护继承时,在派生类中,基类的公有成员和保护成员作为派生类的保护成员,派生类的成员函数可以直接访问它们,而派生类的成员函数无法直接访问基类的私有成员。
在类外部,派生类的对象无法访问基类的所有成员。
(4) 首先基类构造函数被调用,子对象所在类构造函数次之,最后执行派生类构造函数。
(5) 若派生类有构造函数而基类没有,当创建派生类的对象时,派生类的相应构造函数被自动调用。
若派生类没有构造函数而基类有,则基类必须拥有缺省构造函数。
只有这样,当创建派生类的对象时,才能自动执行基类的默认构造函数。
若派生类有构造函数,且基类有缺省构造函数,则创建派生类的对象时,基类的缺省构造函数会自动执行,除非当前被调用的派生类构造函数在其初始化段中显式地调用了基类的有参构造函数。
若派生类和基类都有构造函数,但基类没有缺省构造函数,则派生类的每一个构造函数必须在其初始化列表中显式地调用基类的某个构造函数。