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 }
运行结果: