实验4数据共享与保护
4.1 实验目的和要求
1.观察程序运行中变量的作用域、生存期。 2.学习类的静态成员的使用。 3.理解类的友元函数、友元类。
4. 学习多文件结构在C++程序中的使用。
4.2 所占学时数
本实验安排2个实验课时.
4.3 实验任务
4.3.1 任务一 (1)题目名称
定义一个Girl类和一个Boy类,这两个类中都有表示姓名、年龄的私有成员变量,都要定义构造函数、析构函数、输出成员变量信息的公有成员函数。 1.根据要求定义相应的类;
2.将Girl类作为Boy类的友元类,在Girl类的成员函数visitboy(boy &)中访问boy类的私有成员,观察程序运行结果; 3.在boy类的某成员函数visitgirl(girl &)中试图访问girl类的私有成员,观察编译器给出的错误信息,理解友元的不可逆性; 4.主函数中正确定义两个类的对象,调用各自的成员函数实现相应的功能;
5.再将boy类作为girl类的友元类,在boy类的某成员函数visistgirl(girl &)中访问girl类的私有成员,观察编译器给出的信
息;
6.删除两个类中的函数visitgirl(girl &),visitboy(boy &),定义一个顶层函数visitboygirl(boy &,girl &),作为以上两个类的友元,通过调用该函数输出男孩和女孩的信息。
(2)构思过程(可用文字、流程图、UML图等方式表达) 首先,根据要求编写两个类:女孩类,男孩类;类中要包含姓名,年龄生日等信息,编写函数,使两个类能够实现基本操作,再有,要求女孩类为男孩类的友元,要用visitboy(boy &)这个关键语句,按要求编写程序,观察出错信息,最后删除类之间友元关系,定义顶层函数,用visitboygirl(boy &,girl &)访问男孩女孩类成员。 (3)程序源码
#include
private :
char name1 ; int age1; public:
Boy (){name1='A';age1=0;}
Boy(char a,int i){name1=a;age1=i;} ~Boy(){} public:
int GetAge (){return age1;} void SetAge(int a){age1=a;} char GetName (){return name1;} void SetName(char a){name1=a;} void show () {
cout<<\\ }
friend class Girl; };
class Girl {
private :
char name2; int age2; public:
Girl (){name2='B';age2=1;}
Girl(char a,int i){name2=a;age2=i;} ~Girl(){} public:
int GetAge (){return age2;} void SetAge(int a){age2=a;} char GetName (){return name2;} void SetName(char a){name2=a;} void show() {
cout<<\”< public: void visitBoy(Boy&b) { name2=b.name1; age2=b.age1; } }; int _tmain(int argc, _TCHAR* argv[]) { Boy b; b.show(); b.SetName ('o'); < } b.SetAge(12); cout<<\cout<<\b.show(); Girl n; n.show(); n.visitBoy(b); cout<<\cout<<\n.show(); return 0; 注: ①在编写第3个要求时在Boy类中加代码: public : void visitGirl(Girl&g) { name1=g.name2; age1=g.age2; } ②在编写第5个要求时在Boy类中加代码: public : void visitGirl(Girl&g) { name1=g.name2; age1=g.age2; } 在Girl类中加代码: friend class Boy; 在main函数中加代码: b.visitGirl(n); b.show (); ③编写第6个要求,定义顶层函数visitboygirl(boy &,girl &), 作为以上两个类的友元,代码如下: #include private : char name1 ; int age1; public: Boy (){name1='A';age1=0;} Boy(char a,int i){name1=a;age1=i;} ~Boy(){} public: int GetAge (){return age1;} void SetAge(int a){age1=a;} char GetName (){return name1;} void SetName(char a){name1=a;} friend void visitboygirl(Boy &b,Girl &g); }; class Girl { private : char name2; int age2; public: Girl (){name2='B';age2=1;} Girl(char a,int i){name2=a;age2=i;} ~Girl(){} public: int GetAge (){return age2;} void SetAge(int a){age2=a;} char GetName (){return name2;} void SetName(char a){name2=a;} friend void visitboygirl(Boy &b,Girl &g); };

