C++面向对象程序设计第三章习题答案解析

整理一下自己写的作业,供考试前复习用,哈哈

进入正题!!!

题目:

2.分析下面的程序,写出其运行时的输出结果

这里就不展示课本源代码,直接给出修改后的代码,错误部分代码已给出具体的注释

 1 #include<iostream>
 2 //原题的#include<iostream.h>写法错误
 3 #include<stdlib.h>
 4 //用于解决闪屏的头文件
5 using namespace std;
 6 //原题缺少该行代码,用于输入cin和输出cout
 7 class Date{
 8 public:
 9     Date(int,int,int);
10     Date(int,int);
11     Date(int);
12     Date();
13     
14     void display();
15 private:
16     int month;
17     int day;
18     int year;
19 
20 };
21 
22 Date::Date(int m,int d,int y):month(m),day(d),year(y){}
23 
24 Date::Date(int m,int d):month(m),day(d)
25 {year=2005;}
26 
27 Date::Date(int m):month(m)
28 {day=1;year=2005;}
29 
30 Date::Date()
31 {month=1;day=1;year=2005;}
32 
33 void Date::display()
34 {
35     cout<<month<<"/"<<day<<"/"<<year<<endl;
36 }
37 
38 int main()
39 {
40     Date d1(10,13,2005);
41     Date d2(12,30);
42     Date d3(10);
43     Date d4;
44     d1.display();
45     d2.display();
46     d3.display();
47     d4.display();
48     system("pause");
49     //解决闪屏的代码
50     return 0;
51 }

运行结果:

 

3.如果将第2题中程序的第四行改为用默认参数,即

Date(int =1,int =1,int =2005);

分析程序有无问题。上机编译,分析出错信息,修改程序使之能通过编译。要求保留上面一行给出的构造函数,同时能输出与第2 题程序相同的输出结果。

解析:在第2题的代码上进行修改。

错误点:

 

 

 修改错误,编译成功的代码:

 1 #include<iostream>
 2 //原题的#include<iostream.h>写法错误
 3 #include<stdlib.h>
 4 //用于解决闪屏的头文件
 5 using namespace std;
 6 //原题缺少该行代码,用于输入cin和输出cout
 7 class Date{
 8 public:
 9     Date(int x=1,int y=1,int z=2005);
10     Date(int,int);
11     Date(int);
12     Date();
13     
14     void display();
15 private:
16     int month;
17     int day;
18     int year;
19 
20 };
21 
22 Date::Date(int m,int d,int y):month(m),day(d),year(y){}
23 
24 Date::Date(int m,int d):month(m),day(d)
25 {year=2005;}
26 
27 Date::Date(int m):month(m)
28 {day=1;year=2005;}
29 
30 Date::Date()
31 {month=1;day=1;year=2005;}
32 
33 void Date::display()
34 {
35     cout<<month<<"/"<<day<<"/"<<year<<endl;
36 }
37 
38 int main()
39 {
40     Date d1(10,13,2005);
41     Date d2(10,30,2005);
42     Date d3(10,1,2005);
43     Date d4(1,1,2005);
44     d1.display();
45     d2.display();
46     d3.display();
47     d4.display();
48     system("pause");
49     //解决闪屏的代码
50     return 0;
51 }

运行结果:

 

 

使用该错误修改方法,实际上就只有一个构造函数起作用,注释其它三个构造函数,输出结果不变,调用原理是多次调用同一个函数,而不是分别调用各自的构造函数。

源代码:

#include<iostream>
//原题的#include<iostream.h>写法错误
#include<stdlib.h>
//用于解决闪屏的头文件
using namespace std;
//原题缺少该行代码,用于输入cin和输出cout
class Date{
public:
    Date(int x=1,int y=1,int z=2005);
    void display();
private:
    int month;
    int day;
    int year;

};

Date::Date(int m,int d,int y):month(m),day(d),year(y){}

void Date::display()
{
    cout<<month<<"/"<<day<<"/"<<year<<endl;
}

int main()
{
    Date d1(10,13,2005);
    Date d2(10,30,2005);
    Date d3(10,1,2005);
    Date d4(1,1,2005);
    d1.display();
    d2.display();
    d3.display();
    d4.display();
    system("pause");
    //解决闪屏的代码
    return 0;
}

4.建立一个对象数组,内放5个学生的数据(学号,成绩),用指针指向数组首元素,输出1,3,5个学生的数据。

源代码及解析:

 1 #include<iostream>
 2 #include<stdlib.h>
 3 using namespace std;
 4 class Student
 5 {
 6 public:
 7     //学生数据的构造函数
 8     Student(int sno,int grade):Sno(sno),Grade(grade){}
 9     void display();
10     int Sno;
11     int Grade;
12 };
13 
14 void Student::display()
15 {
16     cout<<Sno<<' '<<Grade<<endl;
17 }
18 
19 int main()
20 {
21     //五个学生的数据信息
22     Student stu[5]={
23     Student(1001,89),
24     Student(1002,90),
25     Student(1003,91),
26     Student(1004,92),
27     Student(1005,93),
28     };
29     //定义指针
30     void(Student::*p1)();
31     p1=&Student::display;
32     //调用函数
33     (stu[0].*p1)();
34     (stu[2].*p1)();
35     (stu[4].*p1)();
36     system("pause");
37     return 0;
38     
39     
40 }

运行结果:

 

posted @ 2019-10-12 15:37  小高冷  阅读(2383)  评论(1编辑  收藏  举报