private:
intx,y;
};
intmain()
{
Vectorv1(1,2),v2(3,4),v3;
cout<<"v1=";
();
cout<<"v2=";
();
v3=v1+v2;
cout<<"v3=v1+v2=";
();
}
【解答】
v1=(1,2)
v2=(3,4)
v3=v1+v2=(4,6)
思考题
1.一个运算符重载函数被定义为成员函数或友元函数后,在定义方式、解释方式和调用方式上有何区别可能会出现什么问题请用一个实例说明之。
【解答】
以二元运算符为例。
运算符重载
定义
解释
调用
成员函数
Obj&operatorop();
Objoperatorop(object);
op()
op(ObjR)
Objop或opObj
ObjLopObjR
左操作数通过this指针指定,右操作数由参数传递
友员函数
friendObj&operatorop(Obj&);
friendObjoperatorop(Obj,Obj);
operatorop(Obj)
operatorop(ObjL,ObjR)
Objop或opObj
ObjLopObjR
操作数均由参数传递
可能会出现的问题:
(1)运算符的左右操作数不同,须用友员函数重载;
(2)当运算符的操作需要修改类对象状态时,应用成员函数重载。
(3)友员函数不能重载运算符=()[]->
必须要用友员函数重载的运算符>><<
程序略。
2.类类型对象之间、类类型和基本类型对象之间用什么函数进行类型转换归纳进行类型转换的构造函数和类型转换函数的定义形式、调用形式和调用时机。
【解答】
构造函数可以把基本类型、类类型数据转换成类类型数据;类类型转换函数可以在类类型和基本数据类型之间做数据转换。
定义形式
调用形式
调用时机
构造函数
ClassX:
:
ClassX(arg,arg1=E1,...,argn=En);
隐式调用
建立对象、参数传递时
类类型转换函数
ClassX:
:
operatorType();
用类型符显式调用;
自动类型转换时隐式调用
需要做数据类型转换时
编程题
1.分别使用成员函数和友元函数编写程序重载运算符“+”,使该运算符能实现两个字符串的连接。
【解答】
(1)使用成员函数
#include
#include
usingnamespacestd;
classs
{
public:
s(){*str='\0';}
s(char*pstr){strcpy(str,pstr);
char*gets(){returnstr;}
soperator+(sobj);
private:
charstr[10];
};
ss:
:
operator+(sobj)
{
strcat(str,);
returnstr;
classcircle
{
public:
circle(doubler){radius=r;}
virtualdoublearea(){return;}
virtualdoublevolume(){return;}
protected:
doubleradius;
};
classsphere:
publiccircle
{
public:
sphere(doubler):
circle(r){}
doublearea()
{return*PI*radius*radius;}
doublevolume()
{return*PI*radius*radius*radius/;}
};
classcolumn:
publiccircle
{
public:
column(doubler,doubleh):
circle(r){height=h;}
doublearea()
{return*PI*radius*(height+radius);}
doublevolume()
{returnPI*radius*radius*height;}
private:
doubleheight;
};
intmain()
{
circle*p;
spheresobj
(2);
p=&sobj;
cout<<"球体:
"<cout<<"体积="<volume()<cout<<"表面积="<area()<columncobj(3,5);
p=&cobj;
cout<<"圆柱体:
"<cout<<"体积="<volume()<cout<<"表面积="<area()<}
2.某学校教职工的工资计算方法为:
所有教职工都有基本工资;
教师月工资为固定工资+课时补贴。
课时补贴根据职称和课时计算。
例如,每课时教授补贴50元,副补贴30元,讲师补贴20元。
管理人员月薪为基本工资+职务工资;
实验室人员月薪为基本工资+工作日补贴。
工作日补贴等于日补贴×月工作日数。
定义教职工抽象类,派生教师、管理人员和实验室类,编写程序测试这个类体系。
【解答】
#include
usingnamespacestd;
classstaff
{
public:
staff(doublebSalary)
{
basicSalary=bSalary;
}
virtualvoidinput()=0;
virtualvoidoutput()=0;
protected:
charname[30];
doublebasicSalary;
};
classteacher:
publicstaff
{
public:
teacher(intbasicsalary=3000):
staff(basicsalary){}
voidinput()
{
cout<<"姓名";
cin>>name;
cout<<"职称1,教授2,副教授3,讲师(输入1,2或3):
";
cin>>title;
cout<<"课时";
cin>>coursetime;
}
voidoutput()
{
doublesalary;
switch(title)
{
case1:
salary=basicSalary+coursetime*50;break;
case2:
salary=basicSalary+coursetime*30;break;
case3:
salary=basicSalary+coursetime*20;
}
cout<<"姓名:
"<"<}
protected:
intcoursetime;
inttitle;
};
classmanage:
publicstaff
{
public:
manage(intbasicsalary=2500):
staff(basicsalary){}
voidinput()
{
cout<<"姓名";
cin>>name;
cout<<"职务工资";
cin>>jobSalary;
}
voidoutput()
{
doublesalary;
salary=basicSalary+jobSalary;
cout<<"姓名:
"<"<}
protected:
doublejobSalary;
};
classtechnician:
publicstaff
{
public:
technician(intbasicsalary=2000):
staff(basicsalary){}
voidinput()
{
cout<<"姓名";
cin>>name;
cout<<"工作日";
cin>>workdays;
}
voidoutput()
{
doublesalary;
salary=basicSalary+workdays*20;
cout<<"姓名:
"<"<}
protected:
intworkdays;
};
intmain()
{
teachert;
();
();
managem;
();
();
technicianh;
();
();
}
3.使用习题第2小题中定义的教师类体系,编写程序,输入某月各种职称教师的工资信息,建立异质链表,输出每位教师的工资条,统计当月的总工资、平均工资、最高工资和最低工资。
【解答】
略
4.改写第8章习题第3小题,把Shape类定义为抽象类,提供共同操作界面的纯虚函数。
TwoDimShape类和ThreeDimShape类仍然是抽象类,只有第3层具体类才提供全部函数的实现。
在测试函数中,使用基类指针实现不同派生类对象的操作。
【解答】
略
第10章模板
选择题
1.关于函数模板,描述错误的是(A)。
(A)函数模板必须由程序员实例化为可执行的函数模板
(B)函数模板的实例化由编译器实现
(C)一个类定义中,只要有一个函数模板,这个类就是类模板
(D)类模板的成员函数都是函数模板,类模板实例化后,成员函数也随之实例化
2.在下列模板说明中,正确的是(C)。
(A)template
(B)template
(C)template
(D)template(typedefT1,typedefT2)
3.假设有函数模板定义如下:
template
Max(Ta,Tb,T&c)
{c =a+b;}
下列选项正确的是(B)。
(A)intx,y;charz;(B)doublex,y,z;
Max(x,y,z);Max(x,y,z);
(C)intx,y;floatz;(D)floatx;doubley,z;
Max(x,y,z);Max(x,y,z);
4.关于类模板,描述错误的是(A)。
(A)一个普通基类不能派生类模板
(B)类模板可以从普通类派生,也可以从类模板派生
(C)根据建立对象时的实际数据类型,编译器把类模板实例化为模