一、选择题
(1)C++语言对C语言做了很多改进,C++语言相对于C语言的最根本的变化是 A)增加了一些新的运算符
B)允许函数重载,并允许设置缺省参数 C)规定函数说明符必须用原型 D)引进了类和对象的概念
(2)对类成员访问权限的控制,是通过设置成员的访问控制属性实现的,下列不是访问控制属性的是
A)公有类型 B)私有类型 C)保护类型 D)友元类型
(3)在类的定义中,用于为对象分配内存空间,对类的数据成员进行初始化并执行其他内部管理操作的函数是
A)友元函数 B)虚函数
C)构造函数 D)析构函数
(4)类的析构函数的作用是 A)一般成员函数的初始化 B)类的初始化
C)对象的初始化 D)删除类创建的对象 (5)下列说法正确的是
A)内联函数在运行时是将该函数的目标代码插入每个调用该函数的地方 B)内联函数在编译时是将该函数的目标代码插入每个调用该函数的地方 C)类的内联函数必须在类体内定义
D)类的内联函数必须在类体外通过加关键字inline定义 (6)下面对静态数据成员的描述中,正确的是 A)静态数据成员可以在类体内进行初始化 B)静态数据成员不可以被类的对象调用
C)静态数据成员不能受private控制符的作用 D)静态数据成员可以直接用类名调用 (7)下面对于友元函数描述正确的是 A)友元函数的实现必须在类的内部定义 B)友元函数是类的成员函数
C)友元函数破坏了类的封装性和隐藏性 D)友元函数不能访问类的私有成员
(8)在公有派生情况下,有关派生类对象和基类对象的关系,下列叙述不正确的是 A)派生类的对象可以赋给基类的对象 B)派生类的对象可以初始化基类的引用 C)派生类的对象可以直接访问基类中的成员 D)派生类的对象的地址可以赋给指向基类的指针 (9)下面程序的运行结果为 #include class A {
public: A(){cout<<\ ~A(){cout<<\};
class B:public A {
public:
B(){cout<<\ ~B(){cout<<\};
void main() { B b;}
A)1234 B)1324 C)1342 D)3142 (10)下列关于虚基类的描述,错误的是 A)设置虚基类的目的是为了消除二义性 B)虚基类的构造函数在非虚基类之后调用
C)若同一层中包含多个虚基类,这些虚基类的构造函数按它们说明的次序调用
D)若虚基类由非虚基类派生而来,则仍然先调用基类构造函数,再调用派生类的构造函数 (11)下列关于多态性的描述,错误的是
A)C++语言中的多态性分为编译时的多态性和运行时的多态性 B)编译时的多态性可通过函数重载实现 C)运行时的多态性可通过模板和虚函数实现 D)实现运行时多态性的机制称为动态绑定
(12)当使用ifstream流类定义一个流对象并打开一个磁盘文件时,文件的隐含打开方式为 A)ios::in B)ios::out
C)ios::in | ios::out D)以上都不对
(13)下列程序的运行结果是 #include class A {
int a; public: A(){a=0;} A(int aa) { a=aa; cout<
void main() {
A x,y (2),z (3); cout<A)00 B)23
C)34 D)25
(14)对虚函数的调用( )
A)一定使用动态联编 B)必须使用动态联编 C)一定使用静态联编 D)不一定使用动态联编
(15)下面程序错误的语句是 ① #include ② void main() ③ {
④ int *p=new int[1]; ⑤ p=9;
⑥ cout <<*p<A)④ B)⑤ C)⑥ D)⑦
(16)在C++语言中,数据封装要解决的问题是 A)数据的规范化 B)便于数据转换 C)避免数据丢失
D)防止不同模块之间数据的非法访问
(17)对类的构造函数和析构函数描述正确的是 A)构造函数可以重载,析构函数不能重载 B)构造函数不能重载,析构函数可以重载 C)构造函数可以重载,析构函数也可以重载 D)构造函数不能重载,析构函数也不能重载 (18)下面程序的运行结果为 #include class A {
int num; public:
A(int i){num=i;}
A(A &a){num=a.num++;} void print(){cout<void main() {
A a (1),b(a); a.print(); b.print(); }
A)11 B)12
C)21 D)22
(19)下面对静态数据成员的描述中,正确的是 A)静态数据成员是类的所有对象共享的数据 B)类的每个对象都有自己的静态数据成员 C)类的不同对象有不同的静态数据成员值 D)静态数据成员不能通过类的对象调用 (20)如果类A被说明成类B的友元,则
A)类A的成员即类B的成员 B)类B的成员即类A的成员
C)类A的成员函数不得访问类B的成员 D)类B不一定是类A的友元
(21)可以在类外用p.a的形式访问派生类对象p的基类成员a,其中a是 A)私有继承的公有成员 B)公有继承的私有成员
C)公有继承的保护成员 D)公有继承的公有成员
(22)建立派生类对象时,3种构造函数分别是a(基类的构造函数)、b(成员对象的构造函数)、c(派生类的构造函数)这3种构造函数的调用顺序为 A)abc B)acb
C)cab D)cba
(23)下面关于虚函数的描述,错误的是
A)在成员函数声明的前面加上virtual修饰,就可把该函数声明为虚函数 B)基类中说明了虚函数后,派生类中对应的函数也必须说明为虚函数 C)虚函数可以是另一个类的友元函数,但不能是静态成员函数 D)基类中说明的纯虚函数在其任何派生类中都必须实现 (24)下面关于模板的描述,错误的是
A)函数模板和类模板的参数可以是任意的数据类型
B)类模板不能直接使用,必须先实例化为相应的模板类,然后定义了模板类的对象后才能使用 C)函数模板不能直接使用,需要实例化为模板函数后才能使用 D)类模板的成员函数都是模板函数
(25)语句ofstream f(\|ios::binary);的功能是建立流对象f,试图打开文件SALARY.DAT并与之连接,并且
A)若文件存在,将文件写指针定位于文件尾;若文件不存在,建立一个新文件 B)若文件存在,将其置为空文件;若文件不存在,打开失败
C)若文件存在,将文件写指针定位于文件首;若文件不存在,建立一个新文件 D)若文件存在,打开失败;若文件不存在,建立一个新文件 (26)下面程序的运行结果是 #include void main() {
int num=1; int &ref=num; ref=ref+2; cout < cout <A)13 B)16
C)36 D)33
(27)下列程序的运行结果为
#include int i=0; class A{ public:
A(){i++;} };
void main() {
A a,b[3],*c; c=b;
cout<
A)2 B)3
C)4 D)5
(28)下面关于C++语言的描述错误的是 A)C++语言支持数据封装
B)C++语言中引入友元没有破坏封装性 C)C++语言允许函数名和运算符重载 D)C++语言支持动态联编
(29)一个函数功能不太复杂但要求被频繁调用,应选用 A)内联函数 B)重载函数
C)递归函数 D)嵌套函数
(30)为了使类中的某个成员不能被类的对象通过成员操作符访问,则不能把该成员的访问权限定义为
A)public B)protected C)private D)static
(31)在C++语言程序中,对象之间的相互通信通过 A)继承实现 B)调用成员函数实现 C)封装实现 D)函数重载实现
(32)类的析构函数是在什么时候调用的? A)类创建时 B)创建对象时
C)删除对象时 D)不自动调用
(33)通常拷贝构造函数的参数是 A)某个对象名 B)某个对象的成员名
C)某个对象的引用名 D)某个对象的指针名
(34)下面程序的运行结果为 #include class A {
static int n; public:
A(){n=1;}
A(int num){n=num;} void print(){cout<int A::n=2; void main() { A a,b (3); a.print(); b.print(); }
A)11 B)13
C)23 D)33
(35)下列不是描述类的成员函数的是 A)构造函数 B)析构函数
C)友元函数 D)拷贝构造函数
(36)继承机制的作用是 A)信息隐藏 B)数据封装
C)定义新类 D)数据抽象
(37)C++语言类体系中,不能被派生类继承的有 A)转换函数 B)构造函数
C)虚函数 D)静态成员函数
(38)下面程序的运行结果是 #include class base{ protected: int a; public:
base(){cout<<\};
class base1:virtual base{ public:
base1(){cout<<\};
class base2:virtual base{ public:
base2(){cout<<\};
class derived:public base1,public base2{ public:
derived(){cout<<\};
int main() {
derived obj; return 0;} A)0123 B)3120
C)0312 D)3012
(39)对于类定义 class A{ public:
virtual void func1(){} void func2(){} };
class B:public A{ public:
void func1(){cout<<″class B func 1″< virtual void func2(){cout<<″class B func 2″<下面正确的叙述是
A) A::func2()和B::func1()都是虚函数 B) A::func2()和B::func1()都不是虚函数
C) B::func1()是虚函数,而A::func2()不是虚函数 D) B::func1()不是虚函数,而A::func2()是虚函数 (40)下面关于运算符重载的描述错误的是
A)运算符重载不能改变操作数的个数、运算符的优先级、运算符的结合性和运算符的语法结构 B)不是所有的运算符都可以进行重载
C)运算符函数的调用必须使用关键字operator
D)在C++语言中不可通过运算符重载创造出新的运算符 (41)下列程序的运行结果为 #include template class FF
{ TT a1, a2, a3; public:
FF(TT b1, TT b2, TT b3){a1=b1; a2=b2; a3=b3;} TT Sum(){return a1+a2+a3;}}; void main()
{ FF x(int(1.1),2,3),y(int(4.2),5,6);
cout<C)6 15.2 D)6.1 15
(42)下面关于C++语言的描述错误的是 A)C++语言支持数据封装
B)C++语言中引入友元没有破坏封装性 C)C++语言允许函数名和运算符重载 D)C++语言支持动态联编 (43)下面程序的运行结果为 #include void swap(int &a,int b) {
int temp; temp=a++; a=b; b=temp; }
void main() {
int a=2,b=3; swap(a,b);
cout<
A)2,3 B)3,2
C)2,2 D)3,3
(44)下列关于C++语言类的描述中错误的是 A)类用于描述事物的属性和对事物的操作 B)类与类之间通过封装而具有明确的独立性
C)类与类之间必须是平等的关系,而不能组成层次结构 D)类与类之间可以通过一些方法进行通信和联络 (45)下列关于构造函数说法不正确的是 A)构造函数必须与类同名 B)构造函数可以省略不写 C)构造函数必须有返回值
D)在构造函数中可以对类中的成员进行初始化
(46)如果友元函数重载一个运算符时,其参数表中没有任何参数则说明该运算符是 A)一元运算符 B)二元运算符
C)选项A)和选项B)都可能 D)重载错误
(47)在重载一个运算符时,如果其参数表中有一个参数,则说明该运算符是 A)一元成员运算符 B)二元成员运算符
C)一元友元运算符 D)选项B)和选项C)都可能 (48)设置虚基类的目的是( )
A)简化程序 B)消除二义性 C)提高运行效率 D)减少目标代码 (49)表示在输出时显示小数位,和在文件输入时判断文件尾的函数分别是 A)showbase()和eof() B)showpoint()和eof()
C)showpoint()和bad() D)showpoint()和good()
(50)下列程序中画线处应填入的语句是 class Base {
public:
void fun(){cout<<\};
class Derived:public Base {
void fun() {
_____________ //调用基类的成员函数fun cout<<\} };
A)fun(); B)Base.fun();
C)Base::fun(); D)Base->fun();
(51)一个类的友元函数能够访问该类的 A)私有成员 B)保护成员
C)公有成员 D)所有成员
(52)关于静态数据成员的描述中正确的是
A)类的静态数据成员不是类的所有对象共享的数据 B)类的静态数据成员不能被类的成员函数调用 C)类的静态数据成员不能被类的构造函数调用 D)类的静态数据成员必须进行初始化 (53)下表正确的是 在父类中的访问属性 访问修饰符 在子类中的访问属性 A) public private 不能直接访问 B) protect public public C) private public 不能直接访问 D) protect private protect (54)下面这个程序的结果是 #include class A {
private:int a; public:
void seta(); int geta();}; void A::seta() { a = 1;}
int A::geta() { return a;} class B
{ private: int a; public:
void seta(); int geta();}; void B::seta() {a = 2;}
int B::geta() {return a;}
class C : public A, public B { private:int b; public:
void display();}; void C::display() { int b = geta(); cout << b;} void main() { C c; c.seta(); c.display();} A)1 B)2
C)随机输出1或2 D)程序有错
(56)下面叙述不正确的是
A)基类的保护成员在派生类中仍然是保护的成员 B)基类的保护成员在公有派生类中仍然是保护的 C)基类的保护成员在私有派生类中仍然是私有的 D)对基类成员的访问必须是无二义性
(57)类A是类B的友元,类B是类C的友元,则下列说法正确的是 A)类B是类A的友元 B)类C是类A的友元
C)类A是类C的友元 D)以上都不对
(58)若有如下类定义: classs B {
void fun(){} protected;
double varl; public:
void fun2(){}
void f4(){cout<<\};
class derive :public base
{void f1(){ cout<<\void f2(int x){ cout<<\void f4(){ cout<<\};
int main() {base *p; derive obj2;
p=&obj2 ; p->f1(); p->f2();
p->f4();return 0;}
(42)程序的输出结果如下, 请填空。
class Base class D1 class D2 class D3 f in Base
#include class Base {public:
Base(){cout<<\void f(){cout<<\class D1:virtual public Base {public:
D1(){cout<<\
void f(){ cout<<\class D2 :virtual public Base {public:
D2(){cout<<\class D3 :public D1,public D2 {public:
D3(){cout<<\int main() {D3 d;
d.Base::f() ; return 0;}
(43)使程序的输出结果如下,请填空
6/15 3/4 9/19
#include
class Franction {
int nume;
int deno; public:
Franction FranAdd(const Franction& x) {
this->nume+=x.nume; this->deno+=x.deno; return *this; }
void InitFranction() {nume=0; deno=1;}
void InitFranction(int n, int d) {nume=n; deno=d;} void FranOutput() {cout<void main() {
Franction *a=new Franction; Franction *b=new Franction; a->InitFranction(6,15); b->InitFranction(3,4); a->FranOutput(); b->FranOutput(); Franction c;
c.InitFranction();
/**************** found *******************/ c=a->FranAdd(*b); c.FranOutput();
}
(44)程序输出结果如下,请填空。 9,11
#include
void prevnext (int x, int &prev,int &next) {
prev=x-1; next=++x; }
int main() {
int x=10,y,z; prevnext (x,y,z);
cout << y << \ return 0; }
(45)静态数据成员在类外进行初始化,且静态数据成员的一个拷贝被类的所有对象 共享 。 三、写运行结果
1、#include class Con {char ID; public:
Con( ):ID('A'){cout<<1;} Con(char c):ID(c){cout<<2;}
Con(Con &c):ID(c.getID()){cout<<3;} char getID( )const {return ID;} };
void show(Con c){cout<2、#include class CSample { public:
CSample();
void Display(); private: int i; static int k; };
CSample::CSample() {i=0;k++;} void CSample::Display()
{ cout<<\int CSample::k=0; void main() { CSample a,b; a.Display(); b.Display();} 运行结果:i=0,k=2 i=0,k=2
3、#include class MyClass {public:
MyClass(){cout<<'A';} MyClass(char c){cout<void main() {MyClass p1,*p2; p2=new MyClass('X'); delete p2;} 运行结果:AXBB
4、#include void main()
{ cout.fill('*'); cout.width(10);
cout<<\运行结果:*****hello 5、#include class A {public:
virtual void func1( ){cout<<\void func2( ){cout<<\};
class B:public A {public:
void func1(){cout<<\void func2(){cout<<\};
void main() {A *p=new B; p->func1();
p->func2();} 运行结果: B1A2
6、#include class A {public:
A(int i){x=i;}
void dispa( ){cout<class B:public A {public:
B(int i):A(i+10){x=i;}
void dispb( ){ dispa( ) ;cout<void main() {B b(2);
b.dispb( ) ; } 运行结果: 12,2
7、#include class Sample {private: int x,y;
static int z; public:
Sample(int a,int b){ x=a;y=b; } void fun(Sample &p); void fun(Sample *p);
static void print(Sample s); };
int Sample::z=10;
void Sample::fun(Sample &p) {x=p.x; y=p.y;
cout<x; y=p->y;
cout<void Sample::print(Sample s) { z=20;
cout<{Sample p(1,2),q(3,4); p.fun(p); p.fun(&q); p.print(p); return 0;} 运行结果: 1 2 3 4 3 20
8. #include class A {
public:
A(){cout<<\
virtual ~A(){cout<<\};
class B:public A {
public: B(int i){
cout<<\buf=new char[i];} virtual ~B() {
delete []buf;
cout<<\}
private: char *buf; };
void fun(A *a) {
delete a; }
void main() {
A *a=new B(15); fun(a);
} 运行结果: A::A() called. B::B() called. B::~B() called. A::~A() called.
9. #include \class test {
private: int num; float fl; public: test( );
int getint( ){return num;} float getfloat( ){return fl;} ~test( ); };
test::test( ) {
cout << \num=0;fl=0.0; }
test::~test( ) {
cout << \}
void main( ) {
test array[2];
cout << array[1].getint( )<< \}
运行结果:
Initalizing default Initalizing default 0 0
Desdtructor is active Desdtructor is active 10. #include class base {
protected:
int private1; public:
base(int p){private1=p;} };
class derived1:virtual public base
{
public:
derived1(int p1):base(p1){};
int get_private(){return private1;} };
class derived2:virtual public base {
public:
derived2(int p2):base(p2){};
int get_private(){return private1;} };
class derived12:public derived1,public derived2 {
public:
derived12(int p1,int p2,int pb):derived1(p1), base(pb), derived2(p2){}; };
void main() {
derived12 d(10,20,30);
cout< 运行结果: 3030
11. #include template class pair {
T value1, value2; public:
pair (T first, T second)
{value1=first; value2=second;} T getmax (); };
template T pair::getmax () {
T retval;
retval = value1>value2? value1 : value2; return retval; }
void main () {
pair myobject (100, 75); cout << myobject.getmax()<
12. #include class A{ public:
static int n; A(){n++;}; ~A(){n--;}; };
int A::n=0; int main(){ A a; A b[3]; A *c=new A; c=&a;
cout<n<运行结果: 5 5
13. #include class A {
public:
A(){ cout<<\
A(int a) {cout<<\};
class B:public A {
public:
B(int a){cout<<\};
class C:public B {
public:
C(int a):B(a){cout<<\};
void main() {
C c(2); }
运行结果: A:no para meter B:int parameter C:int parameter
14. #include class myclass
{
int a, b; public:
friend int sum(myclass x); void set_ab(int i, int j); };
void myclass::set_ab(int i, int j) {
a = i; b = j; }
int sum (myclass x) { return x.a + x.b;} void main() { myclass n;
n.set_ab (3, 4); cout < 运行结果: 7 四、编程题:
1.编写一个学生和教师数据输入和显示程序,学生数据要求有编号、姓名、班号和成绩,教师数据有编号、姓名、职称和部门。要求将编号、姓名的输入和显示设计成一个类person,并作为学生数据操作类student和教师数据操作类teacher的基类,学生数据中的班号和成绩的输入和显示在student类中实现,教师数据中的职称和部门的输入和显示在teacher类中实现。最后在主函数中进行该类的测试。
下面给出了基类person的主要成员:
(1) 私有成员:
? int no;编号
? string name;姓名 (2) 公有成员:
? void input();编号和姓名的输入 ? void display();编号和姓名的显示
2.建立一个ARRAY类,求一维数组中各元素的最大值、最小值和平均值。要求如下:
(1) 私有成员:
? int data[10]:数组名称 ? int max:元素的最大值 ? int min:元素的最小值
? float average:各元素的平均值 (2) 公有成员:
? 构造函数ARRAY(int a[10]):初始化成员数组
? void process():求data数组中的最大值、最小值和平均值 ? void print():输出数组中元素的最大值、最小值和平均值 (3) 在主程序中进行该类的测试。
3.现有Complex类用于描述复数,其定义如下:
class Complex{ private:
double image; //描述实部 double real; //描述需部
public:
Complex (double i=0,double j=0)
{ real=i;
image=j; }
};
在复数类中重载“+”运算符用于完成可以将一个复数和一个复数相加后返回一个复数;重载“-”运算符用于将一个复数的实部和一个实数相减并返回一个复数;重载 “<<”运算符为复数类友员,用于输出复数。重新定义复数类,并在main函数中测试。
4、一个简单的时间类Time,它具有数据成员h、m、s(用来表示当前时间的时、分、秒)和相应的类成员函数。试完成各类成员函数并编制主函数,说明Time类对象,对定义的各成员函数进行调用,以验证它们的正确性。 class Time {
private: int h,m,s; public:
Time(int h0=0,int m0=0,int s0=0);//构造函数,设置时、分、秒并设置参数默认值 void addSec(int sec); //增加若干秒,sec>0 void addMin(int min); //增加若干分,min>0
void addHour(int hour); //增加若干小时,hour>0
void print( ); //在屏幕上输出有关数据(时:分:秒) };
注意:对时分秒的增加要涉及到所谓的“进位”处理问题:秒数超过60要“进位”到分,超过60分则要“进位”到时,而时数超过24后要“甩掉”24以上的部分。 5、自定义如下形式的point类,其对象表示平面上的一个点(x,y),通过类成员函数方式对该类重载双目运算符“+”和“^”,用来求出两个对象的和以及两个对象(平面点)的距离。各运算符的使用含义(运算结果)如下所示: (1.2,-3.5)+(-1.5,6)=(-0.3,2.5) (1.2,-3.5)^(-1.5,6)= 9.87623
实现类成员函数,并编制主函数,说明类对象,而后通过类对象实现所定义的相关运算(以验证其正确性)。 class point { private:
double x,y; public:
point(double x0=0,y0=0) { x=x0;y=y0 ;}
point operator+(point pt2); double operator^(point pt2); void display(); };
6、创建类Block用来描述长方体,私有数据成员length、width、height记录长方体的长、宽、高。要求用成员函数实现以下功能:①成员函数input用来从键盘分别输入长方柱的长、宽、高;②成员函数volume计算长方柱的体积;③成员函数output输出长方柱的体积。
7、有一个日期类Date,它有私有数据y,m,d,此类的对象作为另一个类Person的私有成员,用以描述一个人的姓名,出生日期及性别,编写必要的成员函数后在main函数中进行测试(Date类和Person类中有默认构造函数和析构函数)。
8、定义基类Student,含有私有数据成员num,name,sex,公有成员函数get_value()用于输入数据,display()用于输出数据。定义派生类Student1(从基类公有继承),含有私有数据成员age,addr,设计派生类的成员函数,使程序运行时输入num,name,sex,age,addr的值,程序应输出以上5个数据的值。 9、写一个程序,定义抽象基类Shape,它有三个公有派生类:类Circle用来描述圆形,类Rectangle用来描述矩形,类Triangle用来描述三角形。用虚函数area( )分别计算几种图形的面积,并求它们的和。
10、将file1.txt文件中的大写字母改为小写字母,复制到另一个文件file3.txt中。
本文来源:https://www.bwwdw.com/article/r09t.html