计 算 机 课 程 实 验 报 告
2012—2013学年度 第一 学期
实验课程 学 号 实验题目 C++面向对象程序设计 11 姓 名 蔡兴明 继承与多态(一) 系别:数学与计算机科学学院 班 级 级计算机科学与技术 指导教师 马学梅 日 期 2012-9-29 1、理解继承在面向对象程序中的重要作用、继承和派生的概念; 2、掌握通过继承派生一个新类的方法; 实验目的 3、理解多态的概念、运算符重载的概念、虚函数的作用; 及要求 4、学习实现多态,掌握几种常用运算符的重载;; 5、掌握虚函数的定义和使用方法; 6、简单面向对象程序的编写 实验内容及具体步骤: 内容1:函数重载 (1) 构造函数重载 ,运行以下程序, #include class COMPLEX { public: COMPLEX (double r=0,double i=0); COMPLEX(const COMPLEX & other); void print( ); COMPLEX add(const COMPLEX & other); COMPLEX subs(const COMPLEX & other); protected: double real, image; }; COMPLEX:: COMPLEX ( double r, double i) { real = r; image =i; return; } COMPLEX:: COMPLEX( const COMPLEX & other ) { real = other.real; image =other.image; return;} void COMPLEX:: print( ) { cout << real; if (image>0) cout << “+”<n = n (不能写成n = n)。 (2) 运算符重载:以下程序要求实现运算符++的前置和后置重载,但实际上并没有实现。试分析原因,并作出修改,以实现此功能。 #include class OperClass { int x; public: OperClass( ); OperClass operator ++( ); OperClass operator ++(int ); void display( ); }; OperClass:: OperClass( ) { x=0; return;} OperClass OperClass :: operator++( ) {OperClass A; ++x; A.x=x; return A;} OperClass OperClass :: operator++(int ) {OperClass A; x ++; A.x=x; return A;} void OperClass::display ( ) { cout <<“x=“<,==: 设计字符串类String,用来存放不定长的字符串,重载运算符“==”,“>”,“<”,用于两个字符串的大于、小于和等于的比较运算。 提示:(1)属于双目运算符,在重载双目运算符时,函数中应该有两个参数。 (2)String类成员变量应为字符型指针; (3)多个构造函数的定义; 测试数据: 1.Chin a china 2.National Computer 3.Examination Rank 4.swust swust #include class CString { public: friend int main(); CString(); CString(CString &s); CString(char *s); friend bool operator >(CString s1,CString s2); friend bool operator <(CString s1,CString s2); friend bool operator ==(CString s1,CString s2); void display(); ~CString(); private: char *str; }; CString::CString() { str=NULL; } CString::CString(CString &s) { str=new char[strlen(s.str)+1]; if(str!=NULL) { strcpy(str,s.str); } } CString::CString(char *s) { str=new char[strlen(s)+1]; if(str!=NULL) { strcpy(str,s); } } bool operator >(CString s1,CString s2) { if(strcmp(s1.str,s2.str)>0) return true; else return false; } bool operator <(CString s1,CString s2) { if(strcmp(s1.str,s2.str)<0) return true; else return false; } bool operator ==(CString s1,CString s2) { if(strcmp(s1.str,s2.str)==0) return true; else return false; } int main() { void Update1(CString &s1,CString &s2); CString s1(\"Chin a \"),s2(\"National \"),s3(\"Examination \"); cout<<\"s1:\";s1.display(); cout<<\"s2:\";s2.display(); cout<<\"s3:\";s3.display(); if(s1>s2) { cout<<\"s1大于s2\"; cout<(CString s1,CString s2);friend bool operator <(CString s1,CString s2);friend bool operator ==(CString s1,CString s2);然后定义字符串,再给字符串赋值为空,再分别用<,>,==重载函数比较运算字符串,最后通过int main()函数输出结果。 内容3 .继承 #include class Mammal { private: int age; int weight; public: Mammal( int age, int weight); int getAge( ); int getWeight( ); }; Mammal::Mammal(int age, int weight) { this->age=age; this->weight=weight; } int Mammal::getAge( ) { return age; } int Mammal::getWeight( ) { return weight; } class Dog : public Mammal //class Dog is a derived class of Mammal { private: int hairColor; //1-white; 2-black; 3-other color public: Dog(int age, int weight, int hairColor); int getColor( ); }; Dog::Dog(int age, int weight, int color) : Mammal(age, weight) //在此初始化基类 { hairColor=color; } int Dog::getColor( ) { return hairColor; } void main( ) { Dog d(8, 20, 1); cout<<\"age=\"< class Cshape { public: void SetColor( int color) { m_nColor=color; } void virtual Display( void) { cout<<\"Cshape\"<Display(); } 3.实验结论: 此函数首先构造两个公共类函数,一个私有类变量,然后依依实现函数;此程序代码运行时出现几个问题,经过查询网络,unknown character '0xa1'就是指是输入程序的时候键入的是全角符号的空格,注意切换全/半角为半角状态,将该行程序重新键入就可以了。还有一个小问题就是将obshape中的s写成了大写S,改过来后就运行成功了; error C2018: unknown character '0xa1' error C2018: unknown character '0xa1' error C2018: unknown character '0xa1' error C2018: unknown character '0xa1' error C2065: 'obShape' : undeclared identifier error C2440: 'initializing' : cannot convert from 'int *' to 'class Cshape *' 内容3、重载加减法 设计CTime类 1、成员变量:hour 、minute、second; 2、多个构造函数: 显示函数:Display() 3、重载++运算符,模拟钟表走动,每次走一秒,每60秒进一分钟,秒又从0开始计算;每60分钟进一小时,分钟从0开始计算。 提示: 1、++运算符为单目运算符,运算符重载函数只有一个参数,如果运算符重载函数为成员函数,还可省略此参数; 2、++有两种使用方式:前置自增运算符和后置自增运算符,为了区别二者,在自增运算符重载函数中,增加一个int型形参,即为后置运算符函数; 测试数据: 1、时间:13:45:39 2、时间:23:58:5 程序代码: #include class Time{ private: int hour,minute,second; public: Time(){} Time(int h,int m,int s){ hour=h; minute=m; second=s; } int gethour(){return hour;} int getminute(){return minute;} int getsecond(){return second;} friend Time operator+(Time a,Time b); friend Time operator ++(Time &c); void display(){ cout<=24){ c.hour=0; } ++c.minute; if(c.minute>=60){ c.minute=0; } ++c.second; if(c.second>60){ c.second=0; } return c; } main() { Time t; Time t1(13,45,39); t1.display(); Time t2(1,3,2); operator+(t1,t2); t2.display(); t=t1+t2; t.display(); ++t1; t1.display(); ++ t2; t2.display(); return 0; } 此程序编程时构造了三个私有的整形变量,八个公共类函数,其中int gethour()、int getminute()、int getsecond()三个函数只是分别返回hour,minute,second;Time operator ++(Time &c)函数就是时针,分针和秒针分别到24,60,60时开始重新重0计时;编此程序时我查阅参考许多程序,因此对函数的重载有了更深的理解,对重载的用法及用途也更加的熟练。