C++程序设计,课程代码4737,课后习题4答案

2018年3月3日21:18:24 发表评论 123 views

习题4

一、填空题

  1. 不能使用类对象的指针取对象的privateprotected的地址。
  2. 构造函数是和同名的函数,析构函数不允许有 返回类型和参数 ,一个类有 1 个析构函数。
  3. 已知一个类的名字为fun,则其复制构造函数的原型可声明为 fun(fun&); fun(const fun&); 两种形式。

二、单项选择题

  1. 能提供封装的C++的下列关键字是( C )。
    A. while  B. union  C. class  D. for
  2. 在下面所列项中,不是面向对象的特点的是( C )。
    A. 多态性  B. 抽象性和封装性  C. 多线程和多任务  D. 继承性
  3. 下面选项中,对类A的析构函数的正确定义是( A )。解析:此题编写的不严谨,最合题意的选择是A,其中参数void,应该理解为无参,正确答案应为:~A::A();
    A. ~A::A(void)  B. void ~A::A(参数)  C. ~A::A(参数)  D. void ~A::A()
  4. 下面有关构造函数的不正确说法是( B )。
    A. 构造函数可以用来实现所有成员变量的初始化  B. 构造函数不是类的成员函数
    C. 当生成类的实例时,自动调用构造函数进行初始化  D. 构造函数用来分配对象所需的内存
  5. 有关析构函数的不正确说法是( C )。
    A. 析构函数在对象生命周期结束时自动被调用  B. 析构函数不得指定参数
    C. 定义析构函数时,可以指定返回类型为void  D. 析构函数名与类名相同
  6. 下面有关类说法错误的是( C )。
    A. 一个类可以有多个构造函数  B. 一个类只能有一个析构函数
    C. 可以给析构函数指定参数  D. 一个类中可以说明具有类类型的数据成员
  7. 下面有关构造函数和new运算符关系的正确说法是( D )。
    A. new运算符不调用构造函数  B. 构造函数一定调用new运算符
    C. 当生成类的实例时,先调用new运算符,然后调用构造函数进行初始化  D. 当用new运算符动态产生类的对象时,new运算符也自动调用构造函数

三、改错题

  1. 找出以下类定义中的错误,并说明错在何处。
    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:语句应以';'结尾。

  2. 找出以下程序中的错误,并说明错在何处。
    #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方法。

四、完成程序题

  1. 下面是一个类的测试程序,设计出能使用如下测试程序的类:
    #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();
    }

    测试结果:26855=81

  2. 完成下面类中的成员函数的定义。
    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;
    }

     

五、程序分析题

  1. 给出下面程序的输出结果。
    #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
    其中变量ab应替换为实际值。

  2. 分析下面程序的输出结果。
    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

六、编程题

  1. 设计一个点类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;
    }

     

  2. 使用内联函数设计一个类,用来表示直角坐标系中的任意一条直线并输出它的属性。
    #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;
    }

     

七、作图题

  1. 假设不涉及操作,已经定义了类Line,使用继承的方法组成Rectangle类。C++程序设计,课程代码4737,课后习题4答案
  2. 假设不涉及操作,已经定义了类Line,使用聚合的方法组成Rectangle类。 C++程序设计,课程代码4737,课后习题4答案
  • 我的微信
  • 这是我的微信扫一扫
  • weinxin
  • 我的支付宝红包
  • 支付宝红包扫一扫打赏
  • weinxin

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: