《C++程序设计教程 第2版》教学素材习题13答案

更新时间:2023-10-16 21:56:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

习题13答案

一、简答题

1.什么是运算符重载?实现运算符重载有几种方法?如何实现? 答案:运算符重载机制能够实现将已有运算符应用到新的数据类型上,赋予运算符新的含义。C++对运算符重载有一些限制,见13.2.1节。

有两种方法可以实现运算符重载,它们是:类的成员函数实现方式和友元函数实现方式。 定义友元的目的是在友元函数中直接访问类的私有成员。实际上,可以通过类的公有函数接口访问类的私有成员,所以对于运算符重载,可以使用非成员、非友元函数实现。但是这种实现方法增加了访问私有数据成员的公有函数的调用时间,不值得提倡。见13.2.2节。

2.如何实现本类对象与其它类对象之间的相互类型转换?

答案:使用运算符重载中的“类型转换函数”将本类对象转换成其他类对象。使用“构造函数”将其他类对象转换成本类对象。

3.什么是虚函数?什么是纯虚函数?它们的作用是什么? 答案:

多态性是面向对象程序设计的重要特性,它与封装性和继承性构成面向对象程序设计的三大特性。这三大特性是互相关联的,封装性是基础,继承性是关键,而多态性是补充。

多态分为静态多态和动态多态。函数重载和运算符重载属于静态多态。静态多态也称为编译时多态。而动态多态是运行时的多态,如某些函数的调用关系在运行阶段才能确定。为了实现函数调用关系的动态多态,可以将函数定义成虚函数。将一个成员函数定义成虚函数的方法是,在函数定义的返回值类型前加关键字virtual。

在抽象类中,有时无法实现某一功能(即无法给出某一函数的具体实现),可以将实现该功能的函数定义成纯虚函数。

虚函数具有函数实现的函数体,而纯虚函数一般没有函数体,即没有函数实现。对纯虚函数,一般只能在其派生类中实现该函数的功能。

4.试比较虚函数与虚基类的概念及作用。 答案:虚函数用于实现动态多态。虚基类用于实现在多重继承情况下基类同名成员在派生类中的访问二义性问题。如果基类是虚基类,则同名数据成员在派生类中只保留一个副本,见12.6节。

二、选择题 答案:

1. C 2. D 3. A 4. D 5. B 6. D 7. D 8. C 9. D

三、运行结果、完善程序 1.

运行结果: n=4 n=3 2, 3

2. 答案:

先看虚线框中的程序,运行结果为: D::show( ) called. 8 若将A行的virtual去掉,则结果为: B::show( ) called. 5

对本题,若将虚线框中的fun( )和main( )函数同时修改成右侧实线框中的对应函数,则若A行有virtural时,结果为: D::show( ) called. 8 ; 若A行无virtual时,结果为: B::show( ) called. 5 。 3.

运行结果为: The B version B

The D1 info: 4 version 1 The D2 info: 100 version B The D3 info: -25 version 3

去掉A行的virtual,则运行结果为: The B version B The B version 1 The B version B The B version 3 4. 答案:

(1)operator char *( ) (2)return s; (3)str = num;

四、编程题 1. 答案:

// 实现1,赋值运算符重(=和+=)载函数的返回值为对象的引用。 // 缺点:不可实现对象的连续赋值,只能 c1= c2

#include

class Complex { float Real, Image; public: Complex(float r=0,float i=0) { Real=r;Image=i; }

void show( ) { cout<<\ } void operator=(Complex &); //用成员实现,注意:=不能用友元实现 void operator+=(Complex &); //用成员实现,+=可以用友元实现 friend Complex operator+(Complex &,Complex &); //用友元实现 friend Complex operator-(Complex &,Complex &); //用友元实现 };

void Complex:: operator=(Complex &c) //返回值 void { Real=c.Real; Image=c.Image; }

void Complex:: operator+=(Complex &c) //返回值 void { Real=Real+c.Real; Image=Image+c.Image; }

Complex operator+(Complex &c1, Complex &c2) { Complex t; t.Real=c2.Real+c1.Real; t.Image=c2.Image+c1.Image; return t; }

Complex operator-(Complex &c1, Complex &c2) { Complex t; t.Real=c1.Real-c2.Real; t.Image=c1.Image-c2.Image; return t; }

void main( ) { Complex c1(1,2),c2(3,4),c3; c3=c1; c3.show( ); c3=c1+c2; c3.show( ); c3+=c2; c3.show( ); c3=c1-c2; c3.show( ); }

// 实现2,赋值运算符重(=和+=)载函数的返回值为对象的引用。 // 优点:可实现对象的连续赋值,如 c1=c2=c3

#include

class Complex { float Real, Image; public: Complex(float r=0,float i=0) { Real=r;Image=i; } void show( ) { cout<<\ } Complex & operator=(Complex &); //用成员实现,注意:=不能用友元实现 Complex & operator+=(Complex &); //用成员实现,+=可以用友元实现 friend Complex operator+(Complex &,Complex &); //用友元实现 friend Complex operator-(Complex &,Complex &); //用友元实现 };

Complex & Complex:: operator=(Complex &c) //返回值为对象的引用 { Real=c.Real; Image=c.Image; return *this; }

Complex & Complex:: operator+=(Complex &c) //返回值为对象的引用 { Real=Real+c.Real; Image=Image+c.Image; return *this; }

Complex operator+(Complex &c1, Complex &c2) { Complex t; t.Real=c2.Real+c1.Real; t.Image=c2.Image+c1.Image; return t;

}

Complex operator-(Complex &c1, Complex &c2) { Complex t; t.Real=c1.Real-c2.Real; t.Image=c1.Image-c2.Image; return t; }

void main( ) { Complex c1(1,2),c2(3,4),c3; c3=c2=c1; c3.show( ); c3=c1+c2; c3.show( ); c3+=c2; c3.show( ); c3=c1-c2; c3.show( ); } 2. 答案:

#include #include

class Fraction { int m, n; // m 是分子,n 是分母 public: Fraction(int im=0,int in=1) { int t=gcd(im,in); m=im/t; n=in/t; if(m*n>0) // 若分子和分母同号 { m=abs(m); n=abs(n); } else // 若分子和分母异号 { m=-abs(m); n=abs(n); }; }

int gcd(int x,int y);

Fraction & operator= ( Fraction b ) {

本文来源:https://www.bwwdw.com/article/5z2f.html

Top