C++面向对象程序设计教程Word文档下载推荐.docx
《C++面向对象程序设计教程Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《C++面向对象程序设计教程Word文档下载推荐.docx(29页珍藏版)》请在冰豆网上搜索。
2)类间具有差别或新增部分(包括非共享的数据和操作代码);
3)类具有层次结构。
什么是单继承、多继承请举例说明。
单继承是指每个派生类只直接继承了一个基类的特征。
例如狗继承自哺乳动物。
多继承是指多个基类派生出一个派生类的继承关系。
比如玩具车同时继承自玩具和车。
什么是多态请举例说明。
多态是指不同的对象收到相同的消息时执行不同的操作。
例如,有一个窗口类对象,还有一个棋子类对象。
当我们发出“移动”消息时,两个对象的行为不同。
面向对象程序设计的主要优点是什么
1.可提高程序的重用性;
2.可控制程序的复杂性;
3.可改善程序的可维护性;
4.能够更好地支持大型程序设计;
5.增强了计算机处理信息的范围;
能够很好地适应新的硬件环境。
简述C++勺主要特点
1)C++是C的超集,保持与C的兼容
2)保持了C的简洁、咼效和接近汇编语言等特点,并对C的功能作了不少扩充用C++编写的程序比C更安全,可读性更好,代码结构更为合理。
3)程序质量咼。
4)增加了面向对象机制
#include<
iostream>
usingnamespacestd;
intmain()
{
inta,b,d,min;
cout<
<
"
Entertwonumbers:
"
;
cin>
>
a>
b;
min=a>
bb:
a;
for(d=2;
d<
min;
d++)
if(((a%d)==0)&
&
((b%d)==0))break;
}
if(d==min)
Nocommondenominators"
<
endl;
return0;
Thelowestcommondenominatoris"
有效
没有函数声明;
函数定义没有写返回值类型。
(1)等价,函数声明可以省略参数的名字。
(2)不等价,第二个的函数定义不能省略参数的名字。
CDAAB
ACBDC
DC
101
1010
10
20
举例说明可以使用const替代#define以消除#define的不安全性。
usingnamespacestd;
inta=1;
#defineT1a+a
#defineT2T1-T1
T2is"
T2<
endl;
上面这个程序,初看应该输出T2is0
但是实际上,得出T2is2
如果把#define换成const,则可以输出想要的结果
用动态分配空间的方法,计算Fibonacci数列的前20项,并存储到动态分配的空间中。
int*pi=newint[20];
*pi=1;
pi[1]=1;
for(inti=2;
i<
20;
i++)
pi[i]=pi[i-2]+pi[i-1];
return0;
重载sroot函数,输出一个数的二次方根。
usingnamespacestd;
doublesroot(intnum)
return(double)sqrt((double)num);
doublesroot(longnum)
doublesroot(doublenum)
return(double)sqrt(num);
解决百钱问题。
将一元人民币换成1、2、5分的硬币,有多少种换法#include<
intnum=0;
Defaultconstructorcalled.
Defaultconstructorcalled.
Construcotor:
a=1,b=2
a=3,b=4
a=5,b=6
Con.
Copycon.default.
Copycon.
A=5
B=14
A=9
5,7
ConstructingConstructingA=5B=15A=10B=15DestructingDestructing
voidpintStu();
函数只有声明,没有定义
age是私有成员,不能用对象直接调用
voidprintStu()和voidsetSno(ints)没有加限定符Student:
:
voidsetAge(inta在类中没有声明
构造函数不能定义为私有。
否则无法创建对象
下面是一个计算器类的定义,请完成该类成员函数的实现。
classcounter
{public:
counter(intnumber);
voidincrement();
ult()<
;
qu*price
修改,通过对象指针访问对象数组,使程序以相反的顺序显示每个对象数组元素的值。
classbook
private:
intqu,price;
public:
book(intqu);
intmult();
};
book:
book(intq)
if(q<
1||q>
5)
qu=1;
else
qu=q;
price=10*qu;
intbook:
mult()
returnqu*price;
bookbooks[5]={1,2,3,4,5};
book*p=books;
p+=4;
for(inti=0;
5;
p->
mult()<
--p;
}return0;
构建一个类Stock,含字符数组stockcode[]及整型数组成员quan、双精度型数据成员price。
构造函数含3个参数:
字符数组na[]及q、p。
当定义Stock的类对象时,将对象的第一个字符串参数赋给数据成员stockcode,第2和第3个参数分别赋给quan、price。
未设置第2和第3个参数时,quan的值为1000,price的值为.成员函数print没有形参,需使用this指针,显示对象数据成员的内容。
编写程序显示对象数据成员的值。
classStock
charstockcode[25];
intquan;
doubleprice;
Stock(charna[],intq=1000,doublep=;
Stock(charna[]);
voidprint();
Stock:
Stock(charna[],intq=1000,doublep=
{strcpy(stockcode,na);
quan=q;
price=p;
voidStock:
print()
stockcode:
this->
stockcode<
quan:
quan<
price:
price<
Stockstock1("
600001"
3000,;
Stockstock2("
600002"
);
();
编写一个程序,已有若干学生的数据,包括学号、姓名、成绩,要求输出这些学生的数据
并计算出学生人数和平均成绩(要求将学生人数和总成绩用静态数据成员表示)。
classstudent
charname[25],studentNo[10];
intscore;
staticintsum;
staticinttotalScore;
student(charna[],charstuNo[],intsc);
voidshow();
staticvoidshowTotal();
student:
student(charna[],charstuNo[],intsc){
strcpy(name,na);
strcpy(studentNo,stuNo);
score=sc;
++sum;
totalScore+=sc;
voidstudent:
show()
姓名:
name<
学号:
studentNo<
cout<
成绩:
score<
showTotal(){
总人数:
sum<
平均成绩:
(double)totalScore/sum<
}
intstudent:
sum=0;
totalScore=0;
students1("
张无忌"
"
111254"
75);
students2("
李莫愁"
"
254114"
60);
students3("
小龙女"
112587"
88);
();
showTotal();
有哪几种继承方式每种方式的派生类对基类成员的继承性如何公有继承,私有继承和保护继承。
基类的私有成员,无论哪种继承方式都不能访问。
公有继承不改变基类的公有和保护成员的访问限制。
私有继承将基类的公有和保护成员都变成私有。
保护继承将基类的公有和保护成员都变成保护。
派生类能否直接访问基类的私有成员若否,应如何实现
不能。
可以在基类里添加一个公有成员函数来访问私有成员,派生类就能继承
这个公有成员函数,实现对基类私有成员的访问。
保护成员有哪些特性保护成员以公有方式或私有方式继承后的访问特性如何保护成员只能被本类或本类的派生类所访问,在类或派生类外是不能被访问的后面一问见第一题的答案。
派生类构造函数和析构函数的执行顺序是怎样的
构造函数是先执行父类的构造函数,再执行类中其他类对象的构造函数,再执行本类的构造函数。
如果同级有多个构造函数,则按声明顺序执行。
析构函数与构造函数的执行顺序刚好相反
派生类构造函数和析构函数的构造规则是怎样的
派生类名(参数总表):
基类名(参数总表)
派生类新增数据成员的初始化语句
派生类中的析构函数与基类无关。
什么是多继承多继承时,构造函数与析构函数的执行顺序是怎样的
多继承是指一个类同时继承自多个不同的基类。
执行顺序同
在类的派生中为何要引入虚基类虚基类构造函数的调用顺序是如何规定的
如果一个类有多个直接基类,而这些直接基类又有一个共同的基类,则在最底层的派生类中会保留这个简介的共同基类数据成员的多份同名成员。
在访问这些同名成员的时候,会产生二义性。
为了解决二义性,引入了虚基类。
1)如果虚基类中定义有带形参的构造函数,并且没有定义默认形式的构造函数,则整个继承结构中,所有直接或间接的派生类都必须在构造函数的成员初始化表中列出对虚基类构造函数的调用,以初始化在虚基类中定义的数据成员。
2)建立一个对象时,如果这个对象中含有从虚基类继承来的成员,则虚基类的成员是由最远派生类的构造函数通过调用虚基类的构造函数进行初始化的。
该派生类的其他基类对虚基类构造函数的调用都自动被忽略。
3)若同一层次中同时包含虚基类和非虚基类,应先调用虚基类的构造函数,再
调用非虚基类的构造函数,最后调用派生类的构造函数。
ACCB
ConstructorB1.
ConstructorB2.
ConstructorA.
3
2
1
主食=bread副食=steak
0,0,0
0,1,0
3,6,9
ConstructorB3.
4,3
4
(1,2)
5,6
(6,9)
classbase1classbase2classlevel2classbase2classlevel1classtoplevel
iomanip>
classtable
table(intp,intq)
i=p;
j=q;
}voidascii(void);
protected:
inti,j;
voidtable:
ascii()
intk=1;
for(;
=j;
setw(4)<
(char)i;
if((k)%12==0)
{cout<
\n"
}k++;
classder_table:
publictable
der_table(intp,intq,char*m):
table(p,q){
c=m;
char*c;
voidder_table:
c<
table:
ascii();
der_tableob('
a'
'
z'
ASCIIvalue---char)"
classarea_c1
{protected:
doubleheight;
doublewidth;
area_c1(doubler,doubles){height=r;
width=s;
virtualdoublearea()=0;
classrectangle:
publicarea_c1
rectangle(doubler,doubles):
area_c1(r,s){}virtualdoublearea();
doublerectangle:
area()
returnheight*width;
classisosceles:
publicarea_c1
isosceles(doubler,doubles):
doubleisosceles:
return(height*width)/2;
{rectangler(10,5);
isoscelesi(4,6);
area_c1*a;
a=&
r;
cout<
矩形的面积是:
a->
area()<
i;
三角形的面积是:
classTime
Time(inth,intm,ints)
hours=h;
minutes=m;
seconds=s;
voiddisplay()
出生时间:
hours<
时"
minutes<
分"
seconds<
秒"
inthours,minutes,seconds;
classDate
Date(intm,intd,inty)
{month=m;
day=d;
year=y;
出生年月:
year<
年"
month<
月"
day<
日"
intmonth,day,year;
classBirthtime:
publicTime,publicDate
Birthtime(charname[],intm,intd,inty,inth,intmi,ints):
Time(h,mi,s),Date(m,d,y)
{strcpy(Childname,name);
voidshowName()
我的名字是:
Childname<
charChildname[25];
Birthtimeb("
xiaoming"
3,6,2012,11,12,42);
display();
classperson
charnumber[25];
charname[25];
person(charnum[],charna[])
strcpy(number,num);
编号:
number<
姓名:
name;
classstudent:
publicperson
intclassNumber,score;
student(charnum[],charna[],intcNumber,intsc):
person(num,na){
classNumber=cNumber;
score=sc;
voidshow()
showName();
班号:
classNumber<
成绩:
classteacher:
chartitle]25],department[25];
teacher(charnum[],charna[],chartit[],chardepart[]):
person(num,na){
strcpy(title,tit);
strcpy(department,depart);
voidsho