习题4
一、填空题
- 不能使用类对象的指针取对象的
private
和protected
的地址。 - 构造函数是和 类 同名的函数,析构函数不允许有 返回类型和参数 ,一个类有 1 个析构函数。
- 已知一个类的名字为
fun
,则其复制构造函数的原型可声明为fun(fun&);
和fun(const fun&);
两种形式。
二、单项选择题
- 能提供封装的C++的下列关键字是( C )。
A.while
B.union
C.class
D.for
- 在下面所列项中,不是面向对象的特点的是( C )。
A. 多态性 B. 抽象性和封装性 C. 多线程和多任务 D. 继承性 - 下面选项中,对类A的析构函数的正确定义是( A )。解析:此题编写的不严谨,最合题意的选择是A,其中参数
void
,应该理解为无参,正确答案应为:~A::A();
A.~A::A(void)
B.void ~A::A(参数)
C.~A::A(参数)
D.void ~A::A()
- 下面有关构造函数的不正确说法是( B )。
A. 构造函数可以用来实现所有成员变量的初始化 B. 构造函数不是类的成员函数
C. 当生成类的实例时,自动调用构造函数进行初始化 D. 构造函数用来分配对象所需的内存 - 有关析构函数的不正确说法是( C )。
A. 析构函数在对象生命周期结束时自动被调用 B. 析构函数不得指定参数
C. 定义析构函数时,可以指定返回类型为void D. 析构函数名与类名相同 - 下面有关类说法错误的是( C )。
A. 一个类可以有多个构造函数 B. 一个类只能有一个析构函数
C. 可以给析构函数指定参数 D. 一个类中可以说明具有类类型的数据成员 - 下面有关构造函数和new运算符关系的正确说法是( D )。
A.new
运算符不调用构造函数 B. 构造函数一定调用new
运算符
C. 当生成类的实例时,先调用new
运算符,然后调用构造函数进行初始化 D. 当用new
运算符动态产生类的对象时,new
运算符也自动调用构造函数
三、改错题
- 找出以下类定义中的错误,并说明错在何处。
class base { int *p; public: //base(int a) { p = &a }; base(int a) { p = &a; } //int Getx() { return m; } int Getx() { return *p; } //~base() { delete p } ~base() { delete p; } };
答:
code:4: error:
语句应以';'
结尾,方法定义的大括号后不应以';'
结尾。
code:5: error:
不能使用未定义的'm'
。
code:6: error:
语句应以';'
结尾。 - 找出以下程序中的错误,并说明错在何处。
#include <iostream> class Point { int x; public: void init(int a) { Setx(a); } int Getx() { return x; } //int Setx(int a) { x = a; } void Setx(int a) { x = a;} }; void main() { Point A; //A.init(24, 56); A.init(24); cout << "A.x = " << A.Getx() << endl; }
答:
code:7: warning:
没有返回值产生警告。
code:10: error:
未初始化的对象A
,对象A
没有匹配的init
方法。
四、完成程序题
- 下面是一个类的测试程序,设计出能使用如下测试程序的类:
#include <iostream> class base { private: int m, n; public: void init(int M, int N) { m = M; n = N; } void print() { std::cout << "2 * 68 - 55 = " << 2 * m - n << std::endl; } }; void main() { base a; a.init(68, 55); a.print(); }
测试结果:2∗68−55=81
- 完成下面类中的成员函数的定义。
class Point { private: int m, n; public: Point(int, int); Point(Point&); }; Point::Point(int a, int b) { m = a; n = b; } Point::Point(Point &t) { m = t.m; n = t.n; }
五、程序分析题
- 给出下面程序的输出结果。
#include <iostream.h> class base { private: int a, b; public: ~base() { cout << "Destry..." << a << "," << b << endl; } base(int a, int b) : b(b), a(a) { cout << "初始化..." << a << "," << b << endl; } };
答:此题编写的不完整,缺少了主程序,但此题考查的是构造函数和析构函数的调用顺序,所以可得:
初始化...a,b
Destry...a,b
其中变量a
和b
应替换为实际值。 - 分析下面程序的输出结果。
class base { private: int x; public: void setx(int a) { x = a; } int getx() { return x; } }; void main() { int *p; base a; a.setx(55); p = new int(a.getx()); cout << *p; }
答:
55
六、编程题
- 设计一个点类
Point
,再设计一个矩形类,矩形类使用Point
类的两个坐标点作为矩形对角顶点,并可以输出4个坐标值和面积。使用测试程序验证程序。#include <iostream> class Point { private: float x, y; public: Point() { x = 0; y = 0; } Point(float X, float Y) { x = X; y = Y; } float getX() { return x; }; float getY() { return y; }; void setX(float X) { x = X; }; void setY(float Y) { y = Y; }; }; class Rectangular { private: Point point[4]; public: Rectangular(Point a, Point d) { point[0] = a; point[1].setX(d.getX()); point[1].setY(a.getY()); point[2] = d; point[3].setX(a.getX()); point[3].setY(d.getY()); } void printPointsLocation() { for(int i = 0; i < 4; ++i) { std::cout << point[i].getX() << ", " << point[i].getY() << std::endl; } } float getArea() { float height, width, area; height = point[0].getY() - point[3].getY(); width = point[1].getX() - point[0].getX(); area = height * width; return area; } void printArea() { std::cout << "area:" << getArea() << std::endl; } }; int main() { Point a(1.0, 10.0), b(10.0, 1.0); Rectangular rect(a, b); rect.printPointsLocation(); rect.printArea(); return 0; }
- 使用内联函数设计一个类,用来表示直角坐标系中的任意一条直线并输出它的属性。
#include <iostream> #include <math.h> class Line { private: int x1, y1, x2, y2; public: Line(int X1, int Y1, int X2, int Y2) { x1 = X1; y1 = Y1; x2 = X2; y2 = Y2; } inline double getLenght() { return sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)); } inline void printPoints() { std::cout << "Point1: " << x1 << ", " << y1 << std::endl; std::cout << "Point2: " << x2 << ", " << y2 << std::endl; } inline void printLenght() { std::cout << "Line.Lenght: " << getLenght() << std::endl; } }; int main() { Line line(10, 10, 60, 80); line.printPoints(); line.printLenght(); return 0; }
七、作图题
- 假设不涉及操作,已经定义了类
Line
,使用继承的方法组成Rectangle
类。 - 假设不涉及操作,已经定义了类Line,使用聚合的方法组成Rectangle类。
历史上的今天:
- 2021: 用文字吐槽,放松一下(3)
本文章百度已收录,若发现本站有任何侵犯您利益的内容,请及时邮件或留言联系,我会第一时间删除所有相关内容。