实验一: 类和对象的定义及使用
实验题目(1)定义一个时间类Time,有三个私有成员变量Hour、Minute、Second,定义构造函数、析构函数以及用于改变、获取、输出时间信息的公有函数,主函数中定义时间对象,并通过调用各种成员函数完成时间的设定、改变、获取、输出等功能。
① 按要求完成类的定义与实现。
② 修改数据成员的访问方式,观察编译结果。
③ 在Time类中定义一个成员函数,用于实现时间增加一秒的功能,主函数中通过对象调用该函数,并输出增加一秒后的时间信息。
④ 定义一个普通函数。
void f(Time t)
{ t. PrintTime( );
}
在Time类中增加拷贝构造函数的定义,主函数中调用该函数,运用调试工具跟踪,分析整个程序调用构造函数(包括拷贝构造函数)和析构函数的次数;再将f函数的形式参数分别修改为引用参数和指针参数(此时函数代码修改为{t-> PrintTime( );},主函数中调用,再分析此时调用构造函数和析构函数的次数。
# include <iostream>
using namespace std;
class Time
{
private :
int Hour;
int Minute;
int Second;
public:
Time (int h ,int m=0,int s=0)
{
cout<<"Executing constructor...\n";
Hour=h;
Minute=m;
Second=s;
}
Time (const Time &t)
{
Hour=t.Hour;
Minute=t.Minute;
Second=t.Second;
cout<<"Copy constructing..."<<endl;
}
void ChangeTime(int h,int m, int s)
{
Hour=h;
Minute=m;
Second=s;
}
void PrintTime ()
{
cout<<Hour<<":"<<Minute<<":"<<Second<<endl;
}
int Gethour()
{
return Hour;
}
int Getminute()
{
return Minute;
}
int Getsecond()
{
return Second;
}
~Time ()
{
cout<<"Destructor called.\n";
}
};
void f(Time t)
{
t. PrintTime( );
cout<<"call f\n";
}
int main()
{
Time Now (8,9,7);
Now.PrintTime();
Now.ChangeTime(5,8,20);
Now.PrintTime();
Now.PrintTime();
Time time1(2,26,49);
time1.PrintTime();
Time time2(time1);
time2.PrintTime();
Time time3(23,59,59);
time3.PrintTime();
f(time2);
return 0;
}
③取消类中成员函数IncreaceOneSecond( )的注释标志,将该函数补充完整,注意时间在增加一秒情况下的进位关系。
该函数的代码如下:
# include <iostream>
using namespace std;
class Time
{
private :
int Hour;
int Minute;
int Second;
public:
Time (int h, int m , int s)
{
cout<<"Executing constructor...\n";
Hour=h;
Minute=m;
Second=s;
}
Time (const Time &t)
{
Hour=t.Hour;
Minute=t.Minute;
Second=t.Second;
cout<<"Copy constructing..."<<endl;
}
void ChangeTime(int h, int m, int s)
{
Hour=h;
Minute=m;
Second=s;
}
void PrintTime ()
{
cout<<Hour<<":"<<Minute<<":"<<Second<<endl;
}
int Gethour()
{
return Hour;
}
int Getminute()
{
return Minute;
}
int Getsecond()
{
return Second;
}
void IncreaceOneSecond ()
{
Second+=1;
while(Second>=60)
{
Minute++;
Second-=60;
}
while(Minute>=60)
{
Hour++;
Minute-=60;
}
while(Hour>=24)
{
Hour-=24;
}
}
~Time ()
{
cout<<"Destructor called.\n";
}
};
void f(Time t)
{
t. PrintTime( );
cout<<"call f\n";
}
int main()
{
Time Now (8,9,7);
Now.PrintTime();
Now.IncreaceOneSecond();
Now.PrintTime();
Now.ChangeTime(5,8,20);
Now.PrintTime();
Now.IncreaceOneSecond();
Now.PrintTime();
Time time1(2,26,49);
time1.PrintTime();
time1.IncreaceOneSecond();
time1.PrintTime();
Time time2(time1);
time2.IncreaceOneSecond();
time2.PrintTime();
Time time3(23,59,59);
time3.IncreaceOneSecond();
time3.PrintTime();
f(time2);
return 0;
}
实验题目(2) 定义一个Girl类和一个Boy类,这两个类中都有表示姓名、年龄的私有成员变量,都要定义构造函数、析构函数、输出成员变量信息的公有成员函数。
①根据要求定义相应的类。
②将Girl类作为Boy类的友元类,在Girl类的成员函数VisitBoy(Boy & )中访问Boy类的私有成员,观察程序运行结果。
③在Boy类的某成员函数VisitGirl(Girl & )中试图访问Girl类的私有成员,观察编译器给出的错误信息,理解原因。
④主函数中正确定义两个类的对象,调用各自的成员函数实现相应功能。
⑤再将Boy类作为Girl类的友元类,在Boy类的某成员函数VisitGirl(Girl & )中访问Girl类的私有成员,观察编译器给出的信息。
⑥删除两个类中的函数VisitGirl(Girl & ) ,VisitBoy(Boy & ),定义一个顶层函数VisitBoyGirl(Boy &, Girl &),作为以上两个类的友元,通过调用该函数输出男孩和女孩的信息。
实验解答:
①定义相应的类,主函数中定义相应的类成员,调用各类的输出函数显示信息。
源程序代码如下:
# include<iostream>
using namespace std;
class Boy;
class Girl
{
char name [25];
int age;
public:
Girl(char N[], int A);
~Girl()
{
cout<<"Girl destructing...\n";
}
void Print();
void VisitBoy(Boy & boy);
};
class Boy
{
char name [25];
int age;
friend Girl;
public:
Boy(char N[],int A);
~Boy()
{
cout<<"Boy destructing...\n";
}
void Print();
void VisitGirl(Girl &);
};
Girl::Girl(char N[],int A)
{
strcpy(name,N);
age=A;
cout<<"Girl constructing...\n";
}
void Girl::Print()
{
cout<<"Girl's name: "<<name<<endl;
cout<<"Girl's age: "<<age<<endl;
}
void Girl::VisitBoy(Boy & boy)
{
cout<<"Boy's name: "<<name<<endl;
cout<<"Boy's age: "<<age<<endl;
}
Boy::Boy(char N[],int A)
{
strcpy(name,N);
age=A;
cout<<"Girl constructing...\n";
}
void Boy::Print()
{
cout<<"Boy's name: "<<name<<endl;
cout<<"Boy's age: "<<age<<endl;
}
void Boy::VisitGirl(Girl & girl)
{
cout<<"Girl's name: "<<name<<endl;
cout<<"Girl's age: "<<age<<endl;
}
int main()
{
Girl girl1("chen",18);
girl1.Print();
Girl girl2("xi",19);
girl2.Print();
Boy boy1("cheng",20);
boy1.Print();
Boy boy2("zhang",16);
boy2.Print();
return 0;
}