怎样使用类和对象   1.构造函数和析构函数的作用是什么?什么时候需要自己定义构造函数和析构 函数?   【解】 略。   2.分析下面的程序,写出其运行时的输出结果。 #include using namespace std; class Date {public: Date(int,int,int); Date(int,int); Date(int); Date(); void display(); private: int month; int day; int year; }; Date::Date(int m,int d,int y):month(m),day(d),year(y) {} Date::Date(int m,int d):month(m),day(d) {year=2005;} Date::Date(int m):month(m) {day=1; year=2005; } Date::Date() {month=1; day=1; year=2005; } void Date::display() {cout< using namespace std; class Date {public: Date(int=1,int=1,int=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< using namespace std; class Student {public: Student(int n,float s):num(n),score(s){} void display(); private: int num; float score; }; void Student::display() {cout<display(); return 0; }   运行时的输出如下: 101 78.5 103 98,5 105 95.5   5.建立一个对象数组,内放5个学生的数据(学号、成绩),设立一个函数max,用指向对象的指针作函数参数,在max函数中找出5个学生中成绩最高者,并输出其 学号。   【解】 程序如下: #include using namespace std; class Student {public: Student(int n,float s):num(n),score(s){} int num; float score; }; int main() {Student stud[5]={ Student(101,78.5),Student(102,85.5),Student(103,98.5), Student(104,100.0),Student(105,95.5)}; void max(Student* ); Student *p=&stud[0]; max(p); return 0; } void max(Student *arr) {float max_score=arr[0].score; int k=0; for(int i=1;i<5;i++) if(arr[i].score>max_score) {max_score=arr[i].score;k=i;} cout< using namespace std; class Student {public: Student(int n,float s):num(n),score(s){} void change(int n,float s) {num=n;score=s;} void display() {cout<display(); p–>change(101,80.5); p–>display(); return 0; }   其他部分仍同第6题的程序。   (4)在(3)的基础上将main函数第3行改为 const Student *p=&stud;   (5)再把main函数第3行改为 Student *const p=&stud;   【解】   (1)有两个错误:   ① stud被声明为常对象后,不能调用对象中的一般成员函数(除非把该成员函数也声明为const型),因此在main函数中调用stud.display( )和stud.change( )是非法的。   ② 若将对象stud声明为常对象,其值是不可改变的,而在主程序中,企图用stud.change函数去改变stud中数据成员的值,是非法的。   因此程序在编译时出错。如果将程序第7行改为 void display() const {cout< using namespace std; class Student {public: Student(int n,float s):num(n),score(s){} void change(int n,float s) const {num=n;score=s;} //常成员函数 void display()const {cout< using namespace std; class Student {public: Student(int n,float s):num(n),score(s){} void change(int n,float s) {num=n;score=s;} void display() {cout<display(); p–>change(101,80.5); p–>display(); return 0; }   在主函数中定义了指针对象p,它指向stud,函数p–>display(?)相当于stud.display(?)。程序合法,运行结果与第6题程序的运行结果相同。   (4)在(3)的基础上将main函数第3行改为 const Student *p=&stud;   程序如下: #include using namespace std; class Student {public: Student(int n,float s):num(n),score(s){} void change(int n,float s) {num=n;score=s;} void display() {cout<display(); p–>change(101,80.5); p–>display(); return 0; }   在主函数中定义了指向const对象的指针变量p,则其指向的对象的值是不能通过指针变量p改变的。为了安全,C++也不允许通过指针变量p调用对象stud中的非const成员函数,在main函数中调用p–>display(?)和p–>change(?)是非法的。为了能正确调用stud中的display函数,应将程序第7行改为 void display() const {cout<change(?)试图通过指针变量p修改类中的数据成员的值,这与指向const对象的指针变量的性质不相容,编译时出错。   在上面的基础上,将程序改为 #include using namespace std; class Student {public: Student(int n,float s):num(n),score(s){} void change(int n,float s) {num=n;score=s;} void display() const{cout<display(); stud.change(101,80.5); //注意此行修改了 p–>display(); return 0; }   在main函数中,不通过指针变量p修改数据成员,而直接通过对象名stud调用change函数,则是允许的,编译能通过。因为并未定义stud为常对象,只是定义了p是指向const对象的指针变量,不能通过指针变量p修改类中的数据成员的值,而不通过指针变量p修改类中的数据成员的值是可以的。   同样,如果不是通过指针变量p调用display函数(即“p->display( );”),而是通过对象名stud调用display函数,则不必将display函数声明为const型。   (5)再把main函数第3行改为 Student *const p=&stud; 定义了一个指向对象的常指针,要求指针变量p的指向不能改变,只能始终指向对象stud。今在程序中未改变p的指向,因此程序合法,而且不需要在定义display和change函数时将它们声明为const型。程序能通过编译,并正常运行。运行的结果与第6题的程序的运行结果相同。   8.修改第6题的程序,增加一个fun函数,改写main函数。在main函数中调用fun函数,在fun函数中调用change和display函数。在fun函数中使用对象的引用(Student &)作为形参。   【解】 可以编写以下程序: #include using namespace std; class Student {public: Student(int n,float s):num(n),score(s){} void change(int n,float s) {num=n;score=s;} void display() {cout< using namespace std; class Product {public: Product(int m,int q,float p):num(m),quantity(q),price(p){}; void total(); static float average(); static void display(); private: int num; //销货员号 int quantity; //销货件数 float price; //销货单价 static float discount; //商店统一折扣 static float sum; //总销售款 static int n; //商品销售总件数 }; void Product::total() //求总销售款和销售件数 {float rate=1.0; if(quantity>10) rate=0.98*rate; sum=sum+quantity*price*rate*(1–discount); //累计销售款 n=n+quantity; //累计销售件数 } void Product::display() //输出商品销售总件数和平均售价 {cout< using namespace std; class Date; //对Date的声明,它是对Date的预引用 class Time {public: Time(int,int,int); friend void display(const Date &,const Time &); //将普通函数display声明为朋友 private: int hour; int minute; int sec; }; Time::Time(int h,int m,int s)     {hour=h;      minute=m;      sec=s;     } class Date {public: Date(int,int,int); friend void display(const Date &,const Time &); //将普通函数display声明为朋友 private:     int month;     int day;     int year; }; Date::Date(int m,int d,int y) {month=m; day=d; year=y; } void display(const Date &d,const Time &t) //是Time和Date两个类的朋友 { cout< using namespace std; class Time; class Date {public:     Date(int,int,int);     friend Time; //将Time类声明为朋友类 private:     int month;     int day;     int year; }; Date::Date(int m,int d,int y):month(m),day(d),year(y){} class Time {public: Time(int,int,int); void display(const Date &); private:     int hour;     int minute;     int sec; }; Time::Time(int h,int m,int s):hour(h),minute(m),sec(s){} void Time::display(const Date &d) { cout< using namespace std; template class Compare {public: Compare(numtype a,numtype b); numtype max(); numtype min(); private: numtype x,y; }; //在类模板外定义各成员函数 template Compare::Compare(numtype a,numtype b) {x=a;y=b;} template numtype Compare::max() {return(x>y)?x:y;} template numtype Compare::min() {return(x cmp1(3,7); cout< cmp2(45.78,93.6); cout<cmp3('a','A' ); cout<