实验目的和要求
(1)掌握类与对象的定义与使用方法,理解面向对象方法中通过对象间传递消息的工作机制。
(2)正确掌握类的不同属性成员的使用方法。
(3)掌握构造函数与析构函数的概念,理解构造函数与析构函数的执行过程。
(4)掌握友元函数和友元类的定义和使用。
(5)基本掌握指针和引用作为函数参数的应用。
实验题目1 定义一个借书证类BookCard,在该类定义中包括如下内容。
(1)私有数据成员:
string id; //借书证学生的学号
string stuName; //借书证学生的姓名
int number; //所借书的数量
(2)公有成员函数:
构造函数 //用来初始化3 个数据成员,是否带默认参数值参考结果来分析
void display() //显示借书证的3 个数据成员的信息
bool borrow() //已借书数量不足10 则将数量加1,数量达到10 则直接返回false
主函数及f()函数代码如下。请结合输出结果完成程序。(学长这里就不给了)
#include <string>
#include <iostream>
using namespace std;
class BookCard
{
private:
string id;
string stuName;
int number;
public:
BookCard(string n = "B20190620", string stu = "雪峰", int num = 4);
void display();
bool borrow();
};
BookCard::BookCard(string n, string stu, int num):id(n),stuName(stu),number(num){}
void f(BookCard& bk)
{
if (!bk.borrow())
{
bk.display();
cout << "you have borrowed 10 books,can not borrow anymore!" << endl;
}
else
bk.display();
}
int main()
{
BookCard bk1("B20190620", "东平", 10), bk2;
f(bk1);
f(bk2);
return 0;
}
void BookCard::display()
{
cout << id << " " << stuName << " " << number << endl;
}
bool BookCard::borrow()
{
if (number == 10)
return 0;
if (number >= 0 && number < 10)
return 1;
}
实验题目2 定义一个时间类Time,有三个私有成员变量Hour、Minute、Second,定义构造函数、析构函数以及用于改变、获取、输出时间信息的公有函数,主函数中定义时间对象,并通过调用各种成员函数完成时间的设定、改变、获取、输出等功能。
① 按要求完成类的定义与实现。
② 修改数据成员的访问方式,观察编译结果。
③ 在Time类中定义一个成员函数,用于实现时间增加一秒的功能,主函数中通过对象调用该函数,并输出增加一秒后的时间信息。
④ 定义一个普通函数。
void f(Time t)
{ t. PrintTime( );
}
在Time类中增加拷贝构造函数的定义,主函数中调用该函数,运用调试工具跟踪,分析整个程序调用构造函数(包括拷贝构造函数)和析构函数的次数;再将f函数的形式参数分别修改为引用参数和指针参数(此时函数代码修改为{t-> PrintTime( );},主函数中调用,再分析此时调用构造函数和析构函数的次数。
class Time
{
private:
int Hour;
int Minute;
int Second;
public:
Time(int h = 0,int m = 0,int n = 0);
Time(const Time& obj);
~Time();
void ChangeTime(int h = 0, int m = 0, int n = 0);
int GetHour();
int GetMinute();
int GetSecond();
void PrintTime();
void IncreaseOnesecond();
};
void f(Time t);
Time::Time(int h, int m, int n)
{
//cout<<"Constructing..."<<endl;
Hour = h;
Minute = m;
Second = n;
}
void Time::ChangeTime(int h, int m, int n)
{
Hour = h;
Minute = m;
Second = n;
}
Time::Time(const Time& ob)
{
//cout<<"Copy constructing..."<<endl;
}
Time::~Time()
{
//cout<<"Destructing..."<<endl;
}
int Time::GetHour()
{
return Hour;
}
int Time::GetMinute()
{
return Minute;
}
int Time::GetSecond()
{
return Second;
}
void Time::PrintTime()
{
cout << Hour << " " << Minute << " " << Second << endl;
}
//void Time::IncreaseOnesecond()
{
Second++;
}
void f(Time t)
{
t.PrintTime();
cout << "call f\n";
}
int main()
{
Time t1;
Time t2(1);
Time t3(1, 2);
Time t4(1, 2, 3);
t1.PrintTime();
t2.PrintTime();
t3.PrintTime();
t4.PrintTime();
t1.ChangeTime(4, 5, 6);
t2.ChangeTime(4, 5, 6);
t3.ChangeTime(4, 5, 6);
t4.ChangeTime(4, 5, 6);
t1.PrintTime();
t2.PrintTime();
t3.PrintTime();
t4.PrintTime();
return 0;
}
程序的运行结果是:
0 0 0
1 0 0
1 2 0
1 2 3
4 5 6
4 5 6
4 5 6
构造函数与析构函数的调用方式及执行顺序是:
构造函数和析构函数的调用方式都是自动调用
构造函数在创建变量时自动执行,析构函数在程序结束后自动执行
③取消类中成员函数IncreaceOneSecond( )的注释标志,将该函数补充完整,注意时间在增加一秒情况下的进位关系。
void Time::IncreaseOnesecond()
{
if (Second == 59)
{
Second = 0;
if (Minute == 59)
{
Minute = 0;
if (Hour == 23)
{
Hour == 0;
}
Hour++;
}
else
Minute++;
}
if (Second >= 0 && Second < 59)
Second++;
}
实验题目3 定义一个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
{
private:
string name;
int age;
friend Boy;
public:
Girl(string N, int A);
~Girl()
{
cout << "Girl destructing...\n";
}
void Print();
void VisitBoy(Boy&);
};
class Boy
{
string name;
int age;
friend Girl ;
public:
Boy(string N, int A);
~Boy()
{
cout << "Boy destructing...\n";
}
void Print();
void VisitGirl(Girl&);
};
Girl::Girl(string N, int A)
{
name = N;
age = A;
cout << "Girl costructing...\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: " << boy.name << endl;
cout << "Boy's age: " << boy.age << endl;
}
Boy::Boy(string N, int A)
{
name = N;
age = A;
cout << "Girl costructing...\n";
}
void Boy::Print()
{
cout << "Girl's name: " << name << endl;
cout << "Girl's age: " << age << endl;
}
void Boy::VisitGirl(Girl& girl)
{
cout << "Boy's name: " << girl.name << endl;
cout << "Boy's age: " << girl.age << endl;
}
int main()
{
Boy boy1("张三", 15);
Girl girl1("李四",16);
boy1.Print();
girl1.Print();
boy1.VisitGirl(girl1);
girl1.VisitBoy(boy1);
}
运行结果学长这里就不放了。
②将Girl类作为Boy类的友元类, 写出Girl类的成员函数VisitBoy(Boy & )的实现代码。
void Girl::VisitBoy(Boy& boy)
{
cout << "Boy's name: " << boy.name << endl;
cout << "Boy's age: " << boy.age << endl;
}
③在Boy类的某成员函数VisitGirl(Girl & )中试图访问Girl类的私有成员,记录编译器给出的错误信息,与②对比,你能得出友元的什么特性?
友元可以访问别的类的私有成员变量。
④在上面代码的基础上,在Girl类的定义中,增加一行代码:friend Boy; 在主函数中通过Boy类对象. VisitGirl(Girl类对象) 的形式输出Girl类对象的信息。编译的结果是什么?写出这一步你的主函数代码,要求分别用友元函数Girl类对象. VisitBoy(Boy类对象);和Boy类对象. VisitGirl(Girl类对象) ;和输出两个类对象的信息。
int main()
{
Boy boy1("张三", 15);
Girl girl1("李四",16);
boy1.Print();
girl1.Print();
boy1.VisitGirl(girl1);
girl1.VisitBoy(boy1);
}
⑤定义一个顶层函数void VisitBoyGirl(Boy &, Girl &),作为以上两个类的友元函数,主函数中通过调用该函数输出男孩和女孩的信息。写出该友元函数的完整代码,以及主函数的代码。
void VisitBoyGirl(Boy& boy, Girl&girl)
{
cout << "Girl's name: " << girl.name << endl;
cout << "Girl's age: " << girl.age << endl;
cout << "Boy's name: " << boy.name << endl;
cout << "Boy's age: " << boy.age << endl;
}
实验小结学长就不放了~大家对照代码查漏补缺,不会的知识点可以google~