};
void main(void) { int no;
char name[8],sex,birth[10],major[10],class1[10],depa[10],title[10]; float eng,math,salary; Student *s; Employee *e;
cout<<\
cin>>name>>sex>>birth>>class1>>no>>major>>eng>>math; s=new Student(name,sex,birth,class1,no,major,eng,math); cout<<\ s->Print();
cout<<\
cin>>name>>sex>>birth>>depa>>title>>salary; e=new Employee(name,sex,birth,depa,title,salary); cout<<\ e->Print(); }
实验十三 1.实验目的 通过本次实验
(1)理解友元函数与运算符重载函数的概念; (2)学会友元函数的定义与使用方法;
(3)掌握运算符重载函数的定义与使用方法; 2.实验要求
(1)编写实验程序
(2)在VC++运行环境中,输入源程序 (3)编译运行源程序
(4)输入测试数据进行程序测试; (5)写出运行结果。 3.实验内容
(1)定义一个复数类,重载“-=”运算符,使这个运算符能直接完成复数的“-=”运算。分别用成员函数与友元函数编写运算符重载函数。在主函数中定义复数对象c1(10,20)、c2(15,30),进行c2-=c1的复数运算,并输出c1、c2的复数值。
(2)定义一个数组类Array,其私有数据成员为整型一维数组a[10]。通过构造函数给a[10]赋初值。用Show函数显示a[10]的元素值。用成员函数重载运算符“+”,直接实现两个一维数组对应元素相加的运算。在主函数中定义数组a、b分别为: int a[10]={1,2,3,4,5,6,7,8,9,10}; int b[10]={4,5,6,7,8,9,10,11,12,13};
用Array定义三个数组对象arr1(a)、arr2(b)、arr3,执行arr3=arr1+arr2运算,输出arr3的数组元素值。
类似地,用友元函数重载运算符“+=”,实现复合赋值运算:arr1+=arr2,并输出arr1的元素值。
(3)定义一个人民币类Money,类中数据成员为元、角、分。用成员函数与友元函数重载
“――”运算符,实现人民币对象的减1运算。在主函数中定义人民币对象m1=10元8角5分及对象m2、m3。对m1作前置“――”并赋给m2。对m1作后置“――”并赋给m3。显示m1、m2、m3的结果。
(4)定义描述字符串的类String,编写字符串运算符“+=”的重载函数,使运算符“+=”用于两个字符串联接操作,即用str1+=str2实现字符串函数strcat(str1,str2)的操作功能。要求分别用成员函数与友元函数编写运算符重载函数。在主函数中定义字符串对象
s1(\与s2(\,进行s1+=s2的字符串联接,并输出s1、s2的值。 4.解答参考 (1)成员函数
# include
float Real,Image; public:
Complex(float r=0,float i=0) { Real=r;Image=i;}
void Show(int i)
{ cout<<\ void operator +=(Complex &c) { Real=Real+c.Real; Image=Image+c.Image; } };
void main(void)
{ Complex c1(10,20),c2(15,30); c1.Show(1); c2.Show(2); c2+=c1; c2.Show(2); }
友元函数
# include
float Real,Image; public:
Complex(float r=0,float i=0) { Real=r;Image=i;}
void Show(int i)
{ cout<<\ friend void operator +=(Complex &c1,Complex &c2); };
void operator +=(Complex &c1,Complex &c2) { c1.Real=c1.Real+c2.Real;
c1.Image=c1.Image+c2.Image; } void main(void)
{ Complex c1(10,20),c2(15,30); c1.Show(1); c2.Show(2); c2+=c1; c2.Show(2); }
程序运行结果: c1=10+20i c2=15+30i c2=25+50i (2) (3)
# include
float Yuans,Jiaos,Fens; public:
Money() //定义默认的构造函数 { Yuans=Jiaos=Fens=0;}
Money(float y,float j,float f)
{ Yuans=y; Jiaos=j; Fens=f; }
Money operator --( ); Money operator --( int );
void Show(void)
{ cout< Money Money::operator -- () { if (Fens==0) { if (Jiaos==0) { if (Yuans==0) cout<<\ else Yuans--; Jiaos=9; } else Jiaos--; Fens=9; } else Fens--; return *this; //返回自加后的人民币对象值 } Money Money::operator-- (int ) { Money temp=*this; //将自加前人民币对象值存入临时对象temp if (Fens==0) { if (Jiaos==0) { if (Yuans==0) cout<<\ else Yuans--; Jiaos=9; } else Jiaos--; Fens=9; } else Fens--; return temp; } void main( void) { Money m1(10,8,5),m2,m3; cout<<\ m1.Show(); m2= --m1; m3= m1--; cout<<\ m2.Show(); cout<<\ m3.Show(); cout<<\ m1.Show(); } 程序运行结果: m1= 10元8角5分 m2= 10元8角4分 m3= 10元8角4分 m1= 10元8角3分 (4)成员函数 # include class String //定义字符串类 { protected : int Length; char *Sp; public: String() //定义缺省的构造函数 {Sp=0;Length=0;} String(const char *s) { Length=strlen(s); Sp=new char[Length +1]; strcpy(Sp,s); } ~String() { if (Sp) delete [] Sp;} void Show() { cout< String operator +=(String &s) { String t; t.Length=Length+s.Length; t.Sp=new char[t.Length+1]; strcpy(t.Sp,Sp); strcat(t.Sp,s.Sp); return t; } }; void main (void) { String s1(\ s1.Show(); s2.Show(); s2+=s1; s2.Show(); } 友元函数 # include class String { protected : int Length; char *Sp; public: //定义初始化构造函数 //定义析构函数 //定义显示字符串函数 //定义字符串拼接成员函数 //定义字符串类