一、简述
1.类与对象的关系
答:对象是类的实例,类是对象的抽象。
2.面向对象程序设计的主要特征
答:抽象性、封装性、继承性、多态性。
3.为什么函数重载和运算符重载属于静态多态性
答:因为函数重载和运算符重载在编译的时候就确定了它对应的类。
4.派生类的成员函数在什么情况下采用覆盖
答:如果派生类的函数与基类函数在函数名,参数类型和个数都相同时,则派生类的成员函数就会覆盖基类的成员函数。
5.什么是多态性
答:多态性是指具有不同功能的函数可以用同一个函数名,用一个函数名可以调用不同内容的函数。
6.友元函数的作用
答:声明函数为一个类的友元函数,则该友元函数可以访问这个类的私有成员。
7.复制构造函数需要用户自己设计吗?在什么情况下要调用复制构造函数答:不需要自己设计,当通过复制一个对象而建立一个新的对象的时候系统会自动调用复制构造函数,把每个数据成员对应的复制过去。
8.基类与派生类对象之间的赋值兼容关系,具体表现在哪些方面
答:(1)派生类对象可以向基类对象赋值;
(2)派生类对象可以代替基类对象向基类对象的引用进行赋值或者初始化。
(3)如果函数的参数是基类对象或基类对象的引用,相应的实参可以用子类对象。
(4)指向基类对象的指针也可以指向派生类对象。
9.c++提供虚函数是要解决什么问题
答:在类的继承中,不同层次中有可能有同名函数,但其功能不同。调用的时候要声明其作用域,比较麻烦。虚函数就是允许在派生类中重新定义与基类同名的函数并且可以通过基类指针或引用来访问基类和派生类中的同名函数。
10.c++提供虚基类解决什么问题
答:当一个派生类有多个直接基类,而这些基类又有一个共同的基类时,最终的派生类中会保留该间接共同基类的多份同名成员,不仅占用了大量储存空间,还增加了访问这些成员时的困难,容易出错。虚基类就使得在继承间接共同基类时只保留一份成员。
二、判断题
1.声明为公有的数据成员可以被派生类和外部程序访问。
2.构造函数的调用顺序和析构函数的调用顺序相同。×
3.派生类的数据成员所占的内存空间为基类的保护和公有数据成员和派生类数
据成员所占的内存空间之和。
4.在创建对象时,系统自动地隐式调用析构函数撤销对象所占得内存空间。×
5.继承能传递。
6.重载是面向对象程序设计多态性的一种形式。
7.父类公有数据成员被派生类继承后,派生类的成员函数可见该公有数据成员。
8.静态数据成员必须在类外初始化,而且能被所有成员函数访问。×
9.类存在嵌套时,构造函数的构造顺序是:先内层类,后外层类。
10.虚函数采用动态联编。
11.在C++中这样来声明一个类:
classcla{
12.private:intx;cla();public:cla(inta);~cla();};构造函数可以作为私有成员。在C++中这样来声明一个类:
classcla{private:intx=10;public:cla();cla(inta);~cla();};×类是抽象的,无实值。
三、单项选择
1、下面有关类与对象的说法中不正确的是(
A)对象是类的实例
B)任何一个对象只能属于一个具体的类
C)一个类只能有一个对象
D)类与对象得关系和数据类型与变量得关系类似;
→2.下列关于虚函数的描述中,正确的是(A
当一个成员函数被声明为虚函数后,其派生类中的同名函数都自动成为虚函数。C))A)重定义函数使用virtual,则该重定义函数仍然是虚函数;√
B)虚函数不得声明为静态函数
虚函数是非静态的、非内联的成员函数,而不能是友元函数,
但虚函数可以在另一个类中被声明为友元函数。一个虚函数无论被公有继承多少次,它仍然保持其虚函数的特性
C)派生类中必须重新定义基类的虚函数;×
有修改必要,将其声明为虚函数3、下面关于成员函数描述中,错误的是(
→A)成员函数一定是内联函数
B)成员函数可以重载
C)成员函数参数可以设定默认值
D)成员函数可以是静态的
4、下面关于派生类描述中,错误的是(D)
A)一个派生类可以作为另一个派生类的基类A)可以设置为内联,也可以不设置。
B)派生类至少有一个基类
C)派生类的成员除了它自己的成员外,还包含它的基类成员
D)派生类中继承的基类成员的访问权限在派生类中保持不变派生方式:Privateprotectedpublic
5、下面描述中,正确的是(A)
A)virtual可以用来声明虚函数
B)含有纯虚函数的类是不能创建对象的,因为它是虚基类
D)静态数据成员可以在定义时初始化
只能在类外初始化静态成员函数没有this指针,←C)即使基类的构造函数没有参数,派生类也必须建立构造函数
6、对于const成员函数下面描述中,正确的是(C)
A)const成员函数只能修改const数据成员
B)const成员函数只能修改一般数据成员
C)const成员函数不能修改任何数据成员
D)const成员函数只能通过const对象调用
只有普通成员函数能对普通数据成员修改和改变值。
7、下列虚基类的声明中,正确的是(D)
A)classvirtualB:publicA
C)classB:publicAvirtual
8、下面描述中,正确的是(D)
A)当通过引用传递参数时,函数创建一个变量以存储参数的值
B)当通过引用传递参数时,函数无法访问参数的值
C)当通过引用传递参数时,调用程序创建一个临时变量以容纳参数的值
D)当通过引用传递参数时,函数访问调用程序中参数的原始值
9、关于静态数据成员,下列描述正确的是(D)
A)静态数据成员可以在类体内进行初始化
B)静态数据成员不可以通过类的对象调用
C)静态数据成员不能接受private控制符作用
E)静态数据成员可以直接通过类名/对象名调用,只能在类外初始化.
10、对于const数据成员下面描述中,错误的是(C)
A)const数据成员必须初始化,并且不能更新
B)const数据成员称为常数据成员
C)可以在类体外定义const数据成员
D)const数据成员的初始化只能通过进行
11、编写c++程序一般需要哪些步骤(B)
A编辑、调试、连接、运行B)virtualclassB:publicAD)classB:virtualpublicA
B
C
D编辑、编译(翻译为机器可识别的语言)、连接、运行编译、调试、编辑、连接编辑、调试、编译、运行
12、决定C++语言中函数的返回值类型的是(D)
Areturn语句中表达式的类型
B调用该函数时系统随机产生的类型
C调用该函数时的主调函数的类型
D在定义该函数时所指定的数据类型
13、下面叙述不正确的是(D)
A派生类一般都用公用派生
B对基类成员的访问必须是无二义性的
C复制兼容规则也适用于多重继承的组合
D基类的公用成员在派生类中仍然是公用的×
14、据封装就是将一组数据和与这组数据有关的操作组装在一起而形成的实体,
称为(A)
A类B对象
C函数D数据库
15、在公用派生类的成员函数不能直接访问基类中继承来的某个成员,则该成员一定是基类中的(A)
A私有成员B公用成员
C保护成员D私有成员或保护成员
16、对基类和派生类的关系描述中,错误的是(B)
A派生类是基类的具体化
B基类继承了派生类的属性
C派生类是基类定义的延续
D基类是派生类的抽象
→17、关于this指针使用说法正确的是(A)
A保证每个对象成员函数能够处理各自的数据
B保证基类的私有成员在子类中可以被访问
C保证基类的保护成员在子类中可以被访问
D保证基类的公用成员在子类中可以被访问
18、所谓多态性是指(B)
A不同的对象调用不同名称的函数
B不同的对象调用相同名称的函数
C一个对象调用不同名称的函数
D一个对象调用不同名称的对象
→19、一个函数功能不太复杂,但频繁被调用,则应把它定义为(C)A重载函数
B递归函数C内联/置/嵌函数inline
D嵌套函数
20、地址作为实参传递给形参,下面说法正确的是(D)
A实参是形参的备份
B实参与形参无关
C形参是实参的备份
D实参与形参是同一对象
22、C++设置虚基类的目的是(C)
A提高运行效率
B实现代码重用
C消除二义性
D简化程序
23、指出下列各类函数中,不是类的成员函数(C)
A构造函数
B析构函数
C友元函数:可以是非成员函数或另一类的成员函数
D拷贝构造函数
24、在公用继承的情况下,基类的成员(私有的除外)在派生类中的访问权限(B)A受限制
B保持不变
C受保护
D不受保护
25、关于友元非成员函数的继承性错误的描述是(D)
A友元函数可以直接访问该类的私有成员
B友元类中的所有成员函数都是这个类的友元函数
C通过友元可以提高程序的运行效率,但却破坏了封装性
D派生类可以被继承基类中的友元关系
26、C++设置虚函数的目的是(D)
A实现代码重用
B实现静态联编
C消除二义性→虚基类
D实现动态联编
27、假定要对类AB定义+运算符重载成员函数,实现两个AB类对象的加法,并返回AB对象,则该成员函数的声明语句为(C)
AABoperator+(AB&a,AB&b);
BAB&operator+(ABa);
CABoperator+(AB&a);eg:Complexoperrator+(Complex&c2)
DAB*operator+(ABb);
28、在类定义的外部,可以访问的成员是(C)
A所有类成员
private的类成员public的类成员
Dprivate或public的类成员BC
29、在C++中,类与类之间的继承关系具有(A)
A传递性B自反性C对称性D反对成性
30、关于构造函数的描述中,错误的是(D)
A没有返回值
B
C
D其名与类名完全相同在创建对象时系统自动调用它在没有定义构造函数的情况下,系统调用它
对象的成员名D对象的指针名31、通常拷贝构造函数的参数是(B)A对象名B对象的引用名C
32、下面的描述中,正确的是(D)
A不可以重载的运算符eg:成员访问运算符
符*域运算符::长度sizeof条件?:
B基类类型的指针可以指向子类,子类类型的指针也可以指向其基类
C可以在构造函数中对静态数据成员初始化
D动态联编要满足两个条件:被调用的成员函数是虚函数;用指针或引用调用虚函数。..成员指针访问运算
四、读程序,写出运行结果
1#include<iostream>
usingnamespacestd;
classA
{private:
inta,b,c;
public:
A(){a=b=c=0;cout<<”constructingA()”<<endl;}
A(intx,inty,intz){a=x;b=y;c=z;cout<<”constructingA(int,int,int)”<<endl;}
~A()
{cout<<”destructingclassA”<<endl;
if(a==b&&b==c)cout<<"a=b=c"<<endl;
elsecout<<"a!=b!=c"<<endl;}
voiddisp()const
{cout<<"a="<<a<<",b="<<b<<",c="<<c<<endl;
};
intmain()
{Aa1;
Aa2(3,6,9);
a1.disp();}
a2.disp();
return0;
}
执行结果:
constructingA()
constructingA(int,int,int)
a=0,b=0,c=0
a=3,b=6,c=9
destructingclassA
a!=b!=c
destructingclassA
a=b=c
2#include<iostream>
usingnamespacestd;
classB
{private:
intx,y;
public:
B(){x=y=0;cout<<”constructingB()”<<endl;}
B(inti,intj){x=i;y=j;cout<<”constructingB(int,int)”<<endl;}
voidcopy(B&s);
voidsetxy(inti,intj){x=i;y=j;}
voidprint(){cout<<”x=”<<x<<”,y=”<<y<<endl;}
};
voidB::copy(B&s){x=s.x;y=s.y;}voidfunc(Bs1,B&s2){}//不改变原始值变原始值
intmain()
{Bp(7,8),q;
q.copy(p);func(p,q);p.print();q.print();
return0;
}
执行结果:
constructingB(int,int)constructingB()x=7,y=8
x=5,y=6
3.#include<iostream>改
usingnamespacestd;classB0{public:voiddisplay(){cout<<"B0::display()"<<endl;}};classB1:publicB0{public:voiddisplay(){cout<<"B1::display()"<<endl;}};classB2:publicB1{public:voiddisplay(){cout<<"B2::display()"<<endl;}};voidfun(B0&ptr){ptr.display();}
intmain(){B0b0;B1b1;B2b2;fun(b0);fun(b1);fun(b2);return0;
}
执行结果:
B0::display()
B0::display()
B0::display()
4.#include<iostream>usingnamespacestd;classB0{public:virtualvoiddisplay(){cout<<"B0::display()"<<endl;};classB1:publicB0{public:voiddisplay(){cout<<"B1::display()"<<endl;}};classD1:publicB1{public:voiddisplay(){cout<<"B2::display()"<<endl;}};voidfun(B0*ptr){ptr->display();}intmain(){B0b0,*p;B1b1;B2b2;p=&b0;fun(p);p=&b1;fun(p);p=&b2;fun(p);return0;}
}
执行结果:
B0::display()B1::display()B2::display()
5.#include<iostream>usingnamespacestd;classA{staticintn;静态函数赋初值后,值就不会改变了public:A(){n++;}~A(){n--;}staticintget_n(){returnn;}};intA::n=0;intmain(){A*p=newA;deletep;cout<<"n="<<A::get_n()<<endl;return0;
}
执行结果:
n=0
6#include<iostream>
usingnamespacestd;classA{public:A(){cout<<"A";}};
classB:publicA{public:B(){cout<<"B"<<endl;}};intmain(){Bb;return0;}执行派生类的构造函数时先调用基类的构造函数。执行结果:
AB
五、C++编程
1、设计一个函数模板,能够计算两个整型数的和、双精度数的和。#include<iostream>
usingnamespacestd;
template<typenameT>
Tadd(Ta,Tb)
{return(a+b);}
intmain()
{inti,i1,i2;
doubled1,d2,d;
cout<<"请输入两个整型数:";
cin>>i1>>i2;
i=i1+i2;
cout<<"i="<<i<<endl;
cout<<"请输入两个实数:";
cin>>d1>>d2;
d=d1+d2;
cout<<"d="<<d<<endl;
return0;
}
2、用运算符重载函数及转换构造函数设计一个C++程序计算:复数+复数、整数+复数、复数+整数(例10.9)。
#include<iostream.h>注:运算符重载函数及转换构造函数classcomplex
{
public:
complex(){real=0;imag=0;}
complex(doubler,doublei){real=r;imag=i;}
friendcomplexoperator+(complex&c1,complex&c2);
complex(doubler){real=r,imag=0;}
voiddispiay();
private:
doublereal;
doubleimag;
};
complexoperator+(complex&c1,complex&c2)
{
returncomplex(c1.real+c2.real,c1.imag+c2.imag);
}
voidcomplex::dispiay()
{
cout<<"("<<real<<","<<imag<<"i)"<<endl;
}
voidmain()
{
complexc1(4,5),c2(5,4),c3;
c3=c1+complex(3.4);
cout<<"(4+5i)+3.4=";
c3.dispiay();
c3=complex(2.3)+c1;
cout<<"2.3+(4+5i)=";
c3.dispiay();
c3=c1+c2;
cout<<"(4+5i)+(5+4i)=";c3.dispiay();}
#include<iostream.h>注:运算符重载函数及转换构造函数和类型转换函数classcomplex
{
public:
complex(){real=0;imag=0;}
complex(doubler,doublei){real=r;imag=i;}
friendcomplexoperator+(complex&c1,complex&c2);complex(doubler){real=r,imag=0;}
operatordouble(){returnreal;}
voiddispiay();
private:
doublereal;
doubleimag;
};
complexoperator+(complex&c1,complex&c2){
returncomplex(c1.real+c2.real,c1.imag+c2.imag);}
voidcomplex::dispiay()
{
cout<<"("<<real<<","<<imag<<"i)"<<endl;}
voidmain()
{
complexc1(4,5),c2(5,4),c3;//将双精度转换为复数型//将双精度转为复数
c3=c1+3.4;
cout<<"(4+5i)+3.4=";
c3.dispiay();
c3=2.3+c1;
cout<<"2.3+(4+5i)=";
c3.dispiay();
c3=c1+c2;
cout<<"(4+5i)+(5+4i)=";
c3.dispiay();
}
3、设计类Point和类Line,其中Line是Point的组合类,即类Line中的数据成员是Point类型的对象,计算任意两点间的距离。
类Point和类Line的参考,Line的成员函数自定义:
#include<iostream>
#include<cmath>
usingnamespacestd;
classPoint
{public:
voidset_XY(){cout<<"请输入两个坐标:";cin>>X>>Y;}
doubleGetX(){returnX;}
doubleGetY(){returnY;}
private:
doubleX,Y;
};
classLine
{
public:
voidLine_len(Point&t1,Point&t2)
{len=sqrt((t1.GetX()-t2.GetX())*(t1.GetX()-t2.GetX())+(t1.GetY()-t2.GetY())*(t1.GetY()-t2.GetY()));}
doubleGetLen(){returnlen;}
private:
Pointp1,p2;
doublelen;
};
intmain()
{Pointp1,p2;
p1.set_XY();
p2.set_XY();
LineB;
B.Line_len(p1,p2);
cout<<B.GetLen()<<endl;
return0;
}4、将例8.4改写为一个多文件程序
5、阅读下列例题
例9.11静态函数的应用。
#include<iostream>
usingnamespacestd;
classstudent
{
public:
student(intn,inta,doubles):num(n),age(a),score(s){}voidtotal();
staticdoubleaverage();
private:
intnum;
intage;
doublescore;
staticdoublesum;
staticintcount;
};
doublestudent::sum=0;
intstudent::count=0;
voidstudent::total()
{
sum+=score;
count++;
}
doublestudent::average()
{
returnsum/count;
}
intmain()
{
studentstu[3]={
student(1101,19,89),
student(1102,18,94),
student(1103,20,91)
};
intn;
cout<<"请输入需要求前多少名同学平均成绩:";
cin>>n;
for(inti=0;i<n;i++)
stu[i].total();
cout<<"这"<<n<<"名同学的平均分为:"<<student::average()<<endl;return0;
}
例9.13友元函数的应用
#include<iostream>
usingnamespacestd;
classDate;
classTime
{
public:
Time(int,int,int);
voiddisplay(Date&);
private:
inthour;
intminute;
intsec;
};
classDate
{
public:
Date(int,int,int);
friendvoidTime::display(Date&);
private:
intmonth;
intday;
intyear;
};
Time::Time(inth,intm,ints)
{
hour=h;
minute=m;
www.99jianzhu.com/包含内容:建筑图纸、PDF/word/ppt 流程,表格,案例,最新,免费下载,施工方案、工程书籍、建筑论文、合同表格、标准规范、CAD图纸等内容。