您好,欢迎来到花图问答。
搜索
您的当前位置:首页2021年C++II习题及其解答(第1版)

2021年C++II习题及其解答(第1版)

来源:花图问答
*欧阳光明*创编 2021.03.07

习题及其解答

欧阳光明(2021.03.07)

第5章 类与对象

5.1 选择题

第7章 1. 在下列结构变量的定义中,不正确的是( 第8章

(a) struct employee (b) struct

{char name[20];

{char name[20];

long code;

long

}emp; }emp;

(c) struct employee

{charname[20];

long code; } ;

employee emp; (d) struct

{char name[20];

long code;

}employee; employee emp;

*欧阳光明*创编 2021.03.07

d )。

code;

*欧阳光明*创编 2021.03.07

2.已知有职工情况结构变量emp定义为: struct employee {char name[20]; long code; struct {int year; int month;

int day;

}birth; }emp;

下列对 emp 的 birth正确赋值方法是( d )。 (a) year=1980;month=5;day=1;

(b) birth.year=1980;birth.month=5;birth.day=1; (c) emp.year=1980;emp.month=5;emp.day=1;

(d) emp.birth.year=1980;emp.birth.month=5;emp.birth.day=1; 3.假定有以下声明和定义,则下面引用形式错误的是( b )。 struct student {int num;

float score;

} stu[3] = {{1001,80},{1002,75},{1003,91}}, *p = stu ; (a) p->num(b)(p++).num (c) (p++)->num(d)(*p).num 4.下列四个运算符中,优先级最低的是( a )。 (a)++ (b) .(c)->(d)()

5.若有以下声明和定义,则下列错误的引用是( d )。 struct worker {int no;

char name[20]; }w, *p=&w;

(a)w.no (b)p->no (c)(*p).no(d)*p.no

6.若有以下声明和定义,则下列引用非法的是( d )。 struct data {int n;

float score; data*q ; };

data a[3]={1001,87,&a[1],1002,75,&a[2],1003,90,&a[0]}; data*p=a;

(a) p->n++(b) (*p).n++(c) ++p->n(d) *p->n 7.关于类和对象不正确的说法是( c )。

(a) 类是一种类型,它封装了数据和操作(b) 对象是类的实例 (c) 一个类的对象只有一个(d) 一个对象必属于某个类 8.在类定义的外部,可以被访问的成员有( c )。

(a) 所有类成员 (b) private或protected的类成员 (c) public的类成员 (d) public或private的类成员 9.关于this指针的说法错误的是( a,d )。 (a) this指针必须显式说明

(b) 当创建一个对象后,this指针就指向该对象 (c) 成员函数拥有this指针 (d) 静态成员函数拥有this指针

10.声明一个类的对象时,系统自动调用( b,d )函数;撤消对象时,系统自动调用( c )函数。

(a) 成员函数(b) 构造函数 (c) 析构函数(d) 复制构造函数 11.下面对构造函数的不正确描述是( b )。

*欧阳光明*创编 2021.03.07

*欧阳光明*创编 2021.03.07

第9章 (a) 系统可以提供默认的构造函数

(b) 构造函数可以有参数,所以也可以有返回值 (c) 构造函数可以重载

(d) 构造函数可以设置默认参数

12.下面对析构函数的正确描述是( a,c )。

(a) 系统可以提供默认的析构函数 (b) 析构函数必须由用户定义 (c) 析构函数没有参数 (d) 析构函数可以设置默认参数 13.对静态成员的不正确描述是( c,d )。 (a) 静态成员不属于对象,是类的共享成员 (b) 静态数据成员要在类外定义和初始化

(c) 调用静态成员函数时要通过类或对象激活,所以静态成员函数拥有this指针 (d) 只有静态成员函数可以操作静态数据成员 14.下面选项中,不是类的成员函数为( c )。

(a) 构造函数(b) 析构函数 (c) 友元函数 (d) 复制构造函数 15.下面对友员的错误描述是( d )。 (a) 关键字friend用于声明友员

(b) 一个类中的成员函数可以是另一个类的友员 (c) 友员函数访问对象的成员不受访问特性影响 (d) 友员函数通过this指针访问对象成员

5.2 阅读下列程序,写出执行结果

4.#include

class A {public:

int f1(); int f2();

void setx(int m){ x=m;cout<int A::f1(){ return x+y;} int A::f2(){ return x-y;} void main() {A a;

a.setx(10);a.sety(5);

cout<答案:

10 5

10 5 15 5

5.#include

class T { public: T(int x,int y) {a=x;b=y;

cout<<\"调用构造函数1.\"<T(T &d)

{cout<<\"调用构造函数2.\"<*欧阳光明*创编 2021.03.07

*欧阳光明*创编 2021.03.07

~T() {cout<<\"调用析构函数.\"<};

void main() {T d1(4,8); T d2(d1);

cout<答案:

调用构造函数1. 4 8 调用构造函数2. 4 8 20

调用析构函数. 调用析构函数.

6.#include

class T { public:

T(int x){ a=x; b+=x;}; static void display(T c)

{ cout<<\"a=\"<static int b;

};

int T::b=5; void main() {T A(3),B(5); T::display(A); T::display(B); }

答案:

a=3 b=13 a=5 b=13

7.#include

#include class point { public:

point(float x,float y)

{ a=x;b=y;cout<<\"点(\"<friend double d(point &A,point &B)

{ return sqrt((A.a-B.a)*(A.a-B.a)+(A.b-B.b)*(A.b-B.b)); }

private: double a,b;

};

void main()

{point p1(2,3); cout<<\"到\"; point p2(4,5);

cout<<\"的距离是:\"<}

答案:

点(3,4)到点(4,5)的距离是:2.82843

8.#include

class A {public: A(){ a=5; }

*欧阳光明*创编 2021.03.07

*欧阳光明*创编 2021.03.07

void printa(){ cout<<\"A:a=\"<private: int a;

friend class B; };

class B {public:

void display1(A t)

{t.a++; cout<<\"display1:a=\"<void display2(A t)

{t.a--; cout<<\"display2:a=\"<void main() {A obj1; B obj2;

obj1.printa();

obj2.display1(obj1); obj2.display2(obj1); obj1.printa(); }

答案:

A:a = 5

display1:a = 6 display2:a = 4 A:a = 5

5.3 编程题

6.定义一个Book(图书)类,在该类定义中包括

数据成员: bookname(书名)、price(价格)和number(存书数量);

成员函数: display()显示图书的情况;borrow()将存书数量减1,并显示当前存书数量;restore()将存书数量加1,并显示当前存书数量。

在main函数中,要求创建某一种图书对象,并对该图书进行简单的显示、借阅和归还管理。

解答:

#include #include #include class Book { public:

void setBook(char*,float,int); void borrow(); void restore(); void display(); private:

char bookname[40]; float price; int number; };

//在类外定义Book类的成员函数

void Book::setBook(char *name, float pri, int num) { strcpy(bookname, name); price=pri; number=num; }

void Book::borrow() { if (number==0 )

{ cout << \"已没存书,退出!\" << endl; abort(); }

number = number - 1;

*欧阳光明*创编 2021.03.07

*欧阳光明*创编 2021.03.07

cout << \"借一次,现存书量为:\" << number << endl; }

void Book::restore() { number = number + 1;

cout << \"还一次,现存书量为:\" << number << endl; }

void Book::display()

{ cout << \"存书情况:\" << endl

<< \"bookname:\" << bookname << endl << \"price:\" << price << endl << \"number:\" << number << endl; }

void main()

{ char flag, ch; Book computer;

computer.setBook( \"c++程序设计基础\" , 32, 1000 ); computer.display(); ch = 'y';

while ( ch == 'y' )

{ cout << \"请输入借阅或归还标志(b/r):\"; cin >> flag; switch ( flag )

{ case 'b': computer.borrow(); break; case 'r': computer.restore(); }

cout << \"是否继续?(y/n)\"; cin >> ch; }

computer.display(); }

7.定义一个Box(盒子)类,在该类定义中包括

数据成员: length(长)、width(宽)和height(高);

成员函数: 构造函数Box 设置盒子长、宽和高三个初始数据;函数volume 计算并输出盒子的体积。

在main函数中,要求创建Box对象,并求盒子的体积。 解答:略。

8.定义一个Student类,在该类定义中包括:一个数据成员score(分数)及两个静态数据成员total(总分)和学生人数count;成员函数scoretotalcount(float s) 用于设置分数、求总分和累计学生人数;静态成员函数sum()用于返回总分;静态成员函数average()用于求平均值。

在main函数中,输入某班同学的成绩,并调用上述函数求全班学生的总分和平均分。 解答:

类声明如下,实现代码略。

class student { public:

void scoretotalcount(float ) ; static float sum(); static float average(); private: float score;

static float total; static float count; };

float student::total=0; float student::count=0;

9. 定义一个表示点的结构类型Point和一个由直线方程y = ax + b确定的直线类Line。结构类型Point有x和y两个成员,它们分别表示点的横坐标和纵坐标。Line类有两个数据成员a和b,它们分别表示直线方程中的系数a和b。Line类有一个成员函数print用于显示直线方程;友员函数setPoint(Line &l1,Line &l2)用于求两条直线的交点。在

*欧阳光明*创编 2021.03.07

*欧阳光明*创编 2021.03.07

main函数中,建立两个直线对象,分别调用print函数显示两条直线的方程,并调用函数setPoint求这两条直线的交点。

解答:

结构和类声明如下,实现代码略。

struct Point//点结构 {

float x; float y; };

class Line//线类 { public:

line(float ,float );//构造函数 void print()//显示直线方程

friend point setpoint(line &l1,line &l2);//求两条直线交点 private: float a,b; };

第6章 运算符重载

6.1 选择题

1.在下列运算符中,能重载的是( a,c,d )。 (a) !(b) sizeof(c) new(d) delete

2. 在下列运算符中,不能重载的是( c )。 (a) <=(b) >>(c) &&(d) &=

3.下列关于运算符重载的描述中,( d )是正确的。

(a) 可以改变参与运算的操作数个数(b) 可以改变运算符原来的优先级 (c) 可以改变运算符原来的结合性(d)不能改变原运算符的语义 4.下列函数中,能重载运算符的函数是( b,c )。

(a) 成员函数 (b) 构造函数(c)析构函数 (d) 友员函数 5.不能用友员函数重载的是( a )。 (a) =(b) == (c) +=(d) != 6.下面描述中,错误的是( b )。

(a) 只有系统预先定义的运算符才可能被重载

(b) 使用类型转换函数不能把一个类转换为另一个类 (c) 使用类型转换函数可以把类转换为基本类型

(d)类型转换函数只能定义为一个类的成员函数,不能定义为类的友员函数

6.2 阅读下列程序,写出执行结果

1.#include

class T { public :

T() { a = 0; b = 0; c = 0; } T( int i , int j , int k )

{ a = i; b =j ; c = k;}

void get( int &i , int &j , int &k ) { i = a; j = b; k = c; } T operator * ( T obj );

private:

int a , b , c;

};

T T::operator * ( T obj ) {T tempobj;

tempobj.a = a * obj.a; tempobj.b = b * obj.b; tempobj.c = c * obj.c; return tempobj;

}

void main()

{T obj1( 1,2,3 ), obj2( 5,5,5 ), obj3;

*欧阳光明*创编 2021.03.07

*欧阳光明*创编 2021.03.07

int a , b , c;

obj3 = obj1 * obj2; obj3.get( a, b, c );

cout << \"( obj1 * obj2 ): \\"

<< \"a = \" << a << '\' << \"b = \" << b<< '\' << \"c = \" << c << '\' << endl; ( obj2 * obj3 ).get( a, b, c ); cout << \"( obj2 * obj3 ): \ \"

<< \"a = \" << a << '\' << \"b = \" << b << '\' << \"c = \"<< c << '\' << endl;

}

答案:

( obj1 * obj2 ): a = 5 b = 10 c = 15 ( obj2 * obj3 ): a = 25 b = 50 c = 75 2.#include < iostream.h >

class vector {public:

vector(){ }

vector(int i,int j) { x = i ; y = j ; }

friend vector operator + ( vector v1, vector v2 ) {vector tempvector ;

tempvector.x = v1.x + v2.x ; tempvector.y = v1.y + v2.y ; return tempvector ; }

void display()

{cout << \"( \" << x << \

private: int x,y; };

void main()

{vector v1(1,2),v2(3,4),v3; cout<<\"v1=\"; v1.display(); cout<<\"v2=\"; v2.display(); v3=v1+v2;

cout<<\"v3=v1+v2=\"; v3.display(); }

答案:

v1 = ( 1, 2 ) v2 = ( 3, 4 )

v3 = v1 + v2 = ( 4, 6 )

6.3 编程题

1.分别使用成员函数和友员函数编程序重载运算符“+”,使该运算符能实现两个字符串的连接。

解答:略。

2.设向量X= ( x1 ,x2 ,x3) 和Y= ( y1 , y2 ,y3 ),则它们之间的加、减和积分别定义为: X+Y= (x1 + y1 , x2 + y2 , x3 + y3 ) X - Y= ( x1 - y1 , x2 - y2 , x3 - y3 ) X * Y=x1 * y1 + x2 * y2 + x3 * y3

编程序对运算符“+”、“-”和“*”重载,实现向量之间的加、减、乘运算。

解答:略。

3. 定义一个类nauticalmile_kilometer,它包含两个数据成员kilometer(千米)和meter(米)。还包含一个构造函数对数据成员初始化;成员函数print用于输出数据成员kilometer和meter的值;类型转换函数double()实现把千米和米转换为海里(1海里=1.852千米)。编写main函数,测试类nauticalmile_kilometer。

*欧阳光明*创编 2021.03.07

*欧阳光明*创编 2021.03.07

解答:

#include

const double n = 1.852; // 定义海里与千米和米的转换系数(1海里=1.852千米) class nauticalmile_kilometer { public:

nauticalmile_kilometer( int km,double m ) { kilometer = km; meter = m; } void print()

{ cout<<\"kilometer=\"<int kilometer;

double meter; };

nauticalmile_kilometer::operator double()

{ return ( meter / 1000 + double( kilometer )) / n; } void main()

{ nauticalmile_kilometer obj( 100,50 ); obj.print();

cout << \"nauticalmile=\" << double(obj) << endl; }

第7章 继 承

7.1 选择题

1.在c++中,类与类之间的继承关系具有( c )。

(a) 自反性 (b) 对称性 (c) 传递性(d) 反对称性 2.下列关于类的继承描述中,( a,b )是错误的。

(a) 派生类可以访问基类的所有数据成员,调用基类的所有成员函数 (b) 派生类也是基类,所以基类具有派生类的全部属性和方法

(c) 继承描述类的层次关系,派生类可以具有与基类相同的属性和方法 (d)一个基类可以有多个派生类,一个派生类可以有多个基类

3.当一个派生类公有继承一个基类时,基类中的所有公有成员成为派生类的( a )。 (a) public成员(b)private成员 (c) protected成员(d)友员

4.当一个派生类私有继承一个基类时,基类中的所有公有成员和保护成员成为派生类的( b )。

(a) public成员(b)private成员 (c) protected成员(d)友员

5.当一个派生类保护继承一个基类时,基类中的所有公有成员和保护成员成为派生类的( c )。

(a) public成员(b)private成员 (c) protected成员(d)友员

6.不论派生类以何种方式继承基类,都不能使用基类的( b )。 (a) public成员(b)private成员

(c) protected成员(d)public成员和protected成员 7.下面描述中,错误的是( b, c )。

(a) 在基类定义的public成员在公有继承的派生类中可见,也能在类外被访问

(b)在基类定义的public和protected成员在私有继承的派生类中可见,在类外可以被访问

(c) 在基类定义的public和protected成员在保护继承的派生类中不可见 (d)在派生类中不可见的成员要变成可访问的需进行访问声明 8.在c++中,不能被派生类继承的函数是( b,c )。 (a) 成员函数 (b)构造函数 (c) 析构函数(d)静态成员函数

9.在创建派生类对象时,构造函数的执行顺序是( d )。

*欧阳光明*创编 2021.03.07

*欧阳光明*创编 2021.03.07

(a)对象成员构造函数、基类构造函数、派生类本身的构造函数 (b) 派生类本身的构造函数、基类构造函数、对象成员构造函数 (c) 基类构造函数、派生类本身的构造函数、对象成员构造函数 (d)基类构造函数、对象成员构造函数、派生类本身的构造函数 10.当不同的类具有相同的间接基类时,有特点( d )。 (a) 各派生类对象将按继承路线产生自己的基类版本 (b) 派生类对象无法产生自己的基类版本

(c) 为了建立惟一的间接基类版本,应该必须改变类格 (d) 为了建立惟一的间接基类版本,应该声明虚继承

7.2 阅读下列程序,写出执行结果

1.#include

class BASE {public:

void get(int i,int j,int k,int l) {a=i; b=j; x=k; y=l;} void print()

{ cout<<\"a=\"<<<\"x=\"<}

int a,b;

protected: int x,y; };

class A:public BASE {public:

void get(int i,int j,int k,int l) { BASE obj3;

obj3.get(50,60,70,80); obj3.print(); a=i;b=j;x=k;y=l;

u=a+b+obj3.a; v=y-x+obj3.b;

}

void print()

{cout<<\"a=\"<<<\"x=\"<cout<<\"u=\"<} private: int u,v; };

void main() {BASE obj1; A obj2;

obj1.get(10,20,30,40); obj2.get(30,40,50,60); obj1.print(); obj2.print(); }

答案:

a = 50 b = 60 x = 70 y = 80 a = 10 b = 20 x = 30 y = 40 a = 30 b = 40 x = 50 y = 60 u = 120 v = 70 2. #include

class BASE1 {public:

BASE1(int i ){cout<<\"调用基类BASE1的构造函数:\"<< i <*欧阳光明*创编 2021.03.07

*欧阳光明*创编 2021.03.07

class BASE2 {public:

BASE2(int j){cout<<\"调用基类BASE2的构造函数:\"<class A:public BASE1,public BASE2 {public:

*欧阳光明*创编 2021.03.07

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuowenda.com 版权所有 湘ICP备2023022495号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务