C++实验报告(类和对象 重载与继承 多态和模板 异常和流)
C++实验报告
目录
C++实验报告 (4)
实验一:类和对象 (4)
1. (4)
代码 (4)
运行结果 (5)
2 (5)
思路: (5)
代码 (5)
运行结果 (8)
3 (8)
思路 (8)
代码 (8)
运行结果 (9)
实验二重载和继承 (9)
1 (9)
思路 (10)
代码 (10)
运行结果 (13)
问题分析: (13)
2 (13)
思路: (13)
代码 (14)
运行结果 (15)
实验三多态与模板 (16)
思路 (16)
代码 (16)
运行结果 (17)
2 (17)
思路 (17)
代码 (18)
运行结果 (19)
3 (19)
思路 (19)
代码 (19)
运行结果 (21)
问题及分析 (21)
实验四异常和流 (21)
1 (21)
思路 (21)
代码 (21)
运行结果 (22)
2 (23)
思路 (23)
代码 (23)
运行结果 (27)
实验总结: (28)
C++实验报告
实验一:类和对象
实验目的:
能够根据软件需要,对客观实体进行抽象(封装)和代码实现。
实验环境:
Visual C++ 6.0
实验内容:
1.设计并测试一个名为Rectangle的矩形类,其属性为矩形的左下角与右上角两个点的坐标,能计算矩形的面积。
代码如下:
#include
using namespace std;
struct point
{
float x;
float y;
};
class Rectangle//矩形类
{
point lowerleft;//矩形左下角点的坐标
point upperright;//矩形右上角点的坐标
public:
void get();//输入矩形左下角点和右上角点的坐标
float area();//计算矩形面积
};
void Rectangle::get()
{
cout<<"输入坐标时:先输入横坐标,再输空格,再输入纵坐标\n\n";
cout<<"请输入矩形左下角坐标:";
cin>>lowerleft.x>>lowerleft.y;
cout<<"请输入矩形右上角坐标:";
cin>>upperright.x>>upperright.y;
}
float Rectangle::area()
{
return (upperright.x-lowerleft.x)*(upperright.y-lowerleft.y);
}
int main()
{
Rectangle juxing;
juxing.get();
float result;
result=juxing.area();
cout<<"矩形面积为:"< return 0; } 运行结果如下: 2.设计并测试一个“人员”类。属性包括:编号、性别、出生日期、身份证号等等。其中“出生日期”定义为一个“日期”类内嵌子对象。用成员函数实现对人员信息的录入和显示。要求包括:构造函数和析构函数、拷贝构造函数、内联成员函数。 思路: 构造函数包括默认构造函数、带参构造函数、拷贝构造函数,在对象创建时调用构造函数,当用一个已存在的类实例去初始化另一个新创建的类实例时,系统会调用拷贝构造函数。在对象消除时调用析构函数。内联函数使用inline标识,在编译阶段,内联函数的函数体代码部分会被嵌入到每一个调用语句处,在程序执行阶段,不会发生程序的控制转移,而是直接运行在编译时嵌入的代码。 代码如下: #include #include using namespace std; class date //日期类 { int year,month,day; public: date(){year=0;month=0;day=0;} //默认构造函数 date(int y,int m,int d) ; //带参构造函数 ~date(){} ; //析构函数 date(date &datep); //拷贝构造函数 void in() //数据输入函数 { cin>>year>>month>>day; } void out() //显示输出函数 { cout< }; class person //人员类 { string name; int num; string sex; date birthday; //内嵌子对象 string ID; public: person(){name="Hello";num=0;sex="no";ID="0";} //默认构造person(string na,int nu,string se,date birth,string I);//带参构造函数 ~person(){} //析构函数 person(person &p); //拷贝构造函数 void input(); //信息输入,内联函数 void show(); //信息输出,内联函数 }; date::date(int y,int m, int d) //date类构造函数的实现 { year=y; month=m; day=d; } date::date(date &datep) //date类拷贝构造函数的实现 { year=datep.year; month=datep.month; day=datep.day; } person::person(string na,int nu,string se,date birth,string I)//person构造函数的实现 { num=nu; sex=se; ID=I; birthday=date(birth);//使用拷贝构造函数 name=na; } person::person(person &p) //拷贝构造函数的实现{ num=p.num; sex=p.sex; ID=p.ID; name=https://www.360docs.net/doc/a58314697.html,; birthday=p.birthday; } inline void person::input() //信息输入函数 { cout<<"请输入个人信息"< cout<<"姓名:"; cin>>name; cout<<"编号:"; cin>>num; cout<<"性别: "; cin>>sex; cout<<"出生日期:"; birthday.in(); cout<<"身份证号: "; cin>>ID; cout< } inline void person::show() //信息输出函数 { cout<<"人员信息显示如下:"< cout<<"姓名:"< cout<<"编号:"< cout<<"性别:"< cout<<"出生日期:"; birthday.out(); cout< cout<<"身份证号:"< } int main() { date a(1990,1,1); person xie("谢端阳",1,"男",a,"1234567890");//调用构造函数person p;//调用默认构造函数 p.show(); p=person(xie); p.show(); p.input(); p.show(); return 0; } 运行结果: 3.声明一个Cat类,拥有静态数据成员HowManyCats,记录Cat的个体数目;静态成员函数GetHowMany( ),获取HowManyCats。设计程序测试这个类,体会静态数据成员和静态成员函数的用法。 思路: 默认HowManyCats为0。在类Cat的构造函数里将HowManyCats加1,用函数GetHowMany( )返回HowManyCats的值。创建Cat类的对象a,此时HowManyCats变为1。再创建对象b,在创建对象a后的HowManyCats基础上加1,变成2。说明类的所有对象共享同一个静态类成员。 静态成员函数只能访问静态数据成员。 代码如下: #include using namespace std; class Cat { private: static int HowManyCats; public: Cat(){ HowManyCats++; } static int GetHowMany(){ return HowManyCats; } void show(); }; int Cat::HowManyCats=0; void Cat::show() { cout<<"There are "< } int main() { Cat a; a.show(); Cat b; b.show(); return 0; } 运行结果如下: 实验二重载和继承 1. 实现如下字符串类String的各项功能,并编写测试程序。 class String{ private: char *str; public: String(char *s=0); String(const String&); int strlenth(void)const; int strcmpp(const String&)const; // 比较字符串 String& operator=(const String&); // 拷贝字符串 String& operator+=(const String&); // 连接字符串 operator const char *(void)const; ~String(); }; 这题我写的的代码不好,请参考《C++Primer Plus第五版》第十二章 思路: 表示字符串的方式有三种:char数组;用引号括起的字符串常量;被设置为字符串的地址的char指针。在本题的类String中,成员str是一个char指针,被设置为字符串的地址。 编写函数代码时,在有关字符串的复制操作中使用strcpy()函数,在比较操作中使用strcmp()函数。重载*操作符后,可用于指向对象的指针。 代码如下: #include #include #include using namespace std; class String{ private: char *str; public: String(char *s); String(const String&a); int Strlenth()const; int Strcmpp(const String&a)const; // 比较字符串 String& operator=(const String&a); // 拷贝字符串 String& operator+=(const String&a); // 连接字符串 operator const char *()const; ~String(); display(); }; String::String(char *s)//构造函数 { if(s==NULL) { str=new char[1]; str[0]='\0'; } else { str=new char[strlen(s) + 1]; strcpy(str,s); } } String::String(const String&a)//拷贝构造函数{ str=new char[strlen(a.str)+1]; ; strcpy(str,a.str); } int String::Strlenth()const { return strlen(str); } int String::Strcmpp(const String&a)const { int x; x=strcmp(str, a.str); if(x>0) cerr<<">"; else if(x<0) cerr<<"<"; else cerr<<"="; return x; } String& String::operator=(const String&a) { str=new char[strlen(a.str)+1]; strcpy(str,a.str); return *this; } String& String::operator+=(const String&a) { char *p=str; str=new char[strlen(a.str)+strlen(p)+1]; strcpy(str,p); strcat(str,a.str); return *this; } String::operator const char *()const { return str; } String::~String() { cerr<<"调用析构函数"< delete []str; } String::display() { //cerr<<"字符串为:"; puts(str); } int main() { char *p="abcdefg"; char *q="hijkl"; String s1(p); String s2(q); String s3(s1);//拷贝构造函数 cerr<<"s1:"; s1.display(); cerr<<"字符串s1长度为:"< cerr<<"s2:"; s2.display(); cerr<<"字符串s2长度为:"< cerr<<"s3:"; s3.display(); cerr<<"字符串s3长度为:"< cerr<<"字符串比较结果(s1:s2):s1"; s1.Strcmpp(s2); cerr<<"s2\n"; cerr<<"将s2拷贝给s3:"< s3=s2; cerr<<"s3:"; s3.display(); cerr<<"连接s1与s2:"< s1+=s2; cerr<<"s1:"; s1.display(); cerr<<"使用*操作符——String *s=new String(s1);"< String *s=new String(s1); cerr<<"s:"; cerr<<*s< delete s; return 0; } 运行结果如下: 问题分析: 在写比较函数Strcmpp时,错误的理解了strcmp(s1,s2)函数的返回值情况, 返回值写成了strcmp(a.str,str)。实际上,当s1 2.分别定义Teacher(教师)类和Cadre(干部)类,采用多重继承方式由这两个类派生出新类Teacher_Cadre(教师兼干部)。要求: (1)在两个基类中都包含姓名、年龄、性别、地址、电话等数据成员。 (2)在Teacher类中还包含数据成员title(职称),在Cadre类中还包含数据成员post(职务),在Teacher_Cadre类中还包含数据成员wages(工资)。 (3)对两个基类中的姓名、年龄、性别、地址、电话等数据成员用相同的名字,在引用这些数据成员时,指定作用域。 (4)在类体中声明成员函数,在类外定义成员函数。 (5)在派生类Teacher_Cadre的成员函数show中调用Teacher类中的display函数,输出姓名、年龄、性别、职称、地址、电话,然后再用cout语句输出职务与工资。 思路: 多重继承指派生类有多个基类。当两个基类中的数据成员有相同名字时,用::操作符指定作用域,如cout<<"职务:"< 代码如下: #include #include using namespace std; class Teacher {public: Teacher(string nam,int a,string s,string tit,string ad,string t); void display(); protected: string name; int age; string sex; string title; string address; string tel; }; Teacher::Teacher(string nam,int a,string s,string tit,string ad,string t): name(nam),age(a),sex(s),title(tit),address(ad),tel(t){ } void Teacher::display() {cout<<"姓名:"< cout<<"年龄:"< cout<<"性别:"< cout<<"职称:"< cout<<"地址:"< cout<<"电话:"< } class Cadre {public: Cadre(string nam,int a,string s,string p,string ad,string t); void display(); protected: string name; int age; string sex; string post; string address; string tel; }; Cadre::Cadre(string nam,int a,string s,string p,string ad,string t): name(nam),age(a),sex(s),post(p),address(ad),tel(t){} void Cadre::display() {cout<<"name:"< cout<<"age:"< cout<<"sex:"< cout<<"post:"< cout<<"address:"< cout<<"tel:"< } class Teacher_Cadre:public Teacher,public Cadre {public: Teacher_Cadre(string nam,int a,string s,string tit,string p,string ad,string t,float w); void show( ); private: float wage; }; Teacher_Cadre::Teacher_Cadre(string nam,int a,string s,string t,string p,string ad,string tel,float w): Teacher(nam,a,s,t,ad,tel),Cadre(nam,a,s,p,ad,tel),wage(w) {} void Teacher_Cadre::show( ) { Teacher::display(); cout<<"职务:"< cout<<"工资:"< } int main( ) { Teacher_Cadre a("张三",50,"男","高级","教师","子虚国乌有市贾雨路5号","1234567",3000); a.show( ); return 0; } 运行结果如下: 实验三多态与模板 1.声明一个Shape抽象类,在此基础上派生出Rectangle和Circle类,二者都有GetArea() 和GetPerim()函数,GetArea用来计算对象的面积,GetPerim用来计算对象的周长。 封装上述各类,并编写测试程序。 思路: 虚函数是一种成员函数,它可以在该类的派生类中被重新定义并被赋予另外一种处理功能。将基类Shape、派生类Rectangle和Circle中的GetArea()和GetPerim()函数都声明为虚函数virtual。 代码如下: #include using namespace std; static float pi=3.1415; class Shape{ public: Shape(){} ~Shape(){} virtual float GetArea()=0; virtual float GetPerim()=0; }; class Rectangle:public Shape{ private: float itsLength,itsWidth; public: Rectangle(float len,float wid):itsLength(len),itsWidth(wid){} ~Rectangle(){} virtual float GetArea(){return itsLength*itsWidth;} virtual float GetPerim(){return 2*(itsLength+itsWidth);} }; class Circle:public Shape{ private: float itsRadius; public: Circle(float r):itsRadius(r){} ~Circle(){} virtual float GetArea(){return pi*itsRadius*itsRadius;} virtual float GetPerim(){return 2*pi*itsRadius;} }; int main() { Shape *s; s=new Rectangle(5,2); cout<<"矩形面积:"< cout<<"矩形周长:"< delete s; s=new Circle(10); cout<<"圆形面积:"< cout<<"圆形周长:"< delete s; return 0; } 运行结果如下: 2.有一种栈,这种栈是按数组索引减小的方向增长的。初始时栈为空且top=21。往栈中压入3个字符后,索引top=18,栈顶元素为list[top]=C。 在这个栈模型中,索引top在每次push索引操作后减小,而在pop操作后则增大。用此模型实现stack类模板。并编写测试程序。 思路: 使用stack类模板,将top初始化为最大值MAX,进行push操作时top减一,然后把值放入数组中top指向的位置。进行pop操作时返回top指向的数组元素,然后top加1。 #include using namespace std; template class stack{ private: int top; T list[MAX]; public: stack(); ~stack(){} void push(T e);//压栈 T pop();//弹栈 T stacktop()const;//获得栈顶的值 T couttop()const; }; template {top=MAX;} template if(top<=0) cout<<"错误!"< --top; list[top]=e; } template { if(top>MAX) cout<<"错误!"< return list[top++]; } template if(top<0) cout<<"错误!"< return list[top]; } template cout<<"索引值top="< return top; } { stack x.push('A'); cout<<"栈顶元素:"< x.couttop(); x.push('B'); cout<<"栈顶元素:"< x.couttop(); x.push('C'); cout<<"栈顶元素:"< x.couttop(); cout<<"弹出栈顶元素"; x.pop(); cout<<"\n弹出后栈顶元素为:"< x.couttop(); cout<<"弹出栈顶元素"; x.pop(); cout<<"\n弹出后栈顶元素为:"< x.couttop(); return 0; } 运行结果: 3.编写程序,它从文件中读取文本,对于所读取的每一个单词,显示该单词出现的行数。使用一个映射,它的每一个元素都是一个对偶(k, v),其中关键值k是—个单词,值v是一个集合,这个集合包含该单词的行数。你可以使用如下定义的类型settype和maptype:typedef set typedef map 思路:一次从文件中读取一行,然后将这一行的字符逐个复制到新字符串b中,遇到空格时意味着复制了一个单词,将空格前的这个单词及其行数插入到maptype中,直至判断到行尾。然后行数加1,再读取一行。重复上述操作,直到文件读取完。 代码如下: #include #include #include #include #include using namespace std; typedef set typedef map int main() { maptype yingshe; ifstream fin; fin.open("XXX.txt"); int line=0; string a; string b=""; while(getline(fin,a)) { for(int i=0;i { if(a[i]!=' ') b+=a[i]; else { yingshe[b].insert(line); b=""; } } yingshe[b].insert(line); line++; b=""; } maptype::iterator it; ostream_iterator cout<<"单词\t出现在第几行\n"; for (it = yingshe.begin(); it != yingshe.end(); ++it) { cout<< (*it).first << "\t"; copy((*it).second.begin(),(*it).second.end(),out); cout< } fin.close(); return 0; 1224: 多态-虚函数问题 Description 请以点类Point为基类派生出一个圆类Circle。Point类的数据成员为x、y(私有属性,存储点的横纵坐标),成员函数有构造函数Point(实现对数据成员x、y的初始化)、输出函数Display(输出点坐标);圆类Circle的数据成员为r(私有属性,存储圆的半径,圆心的点坐标通过继承点类Point加以实现),成员函数有构造函数Circle、计算圆的面积函数Area、计算圆的周长函数Perimeter和输出函数Display,其中构造函数实现基类和圆类的数据成员的初始化,Display函数实现圆心坐标、圆的半径、圆的面积(利用Area函数实现)和圆的周长(利用Perimeter函数实现)的输出。实现Point类和Circle类的定义及成员函数。主函数的代码(不允许改动)如下: int main() { double x,y,r; cin>>x>>y>>r; //圆心的点坐标及圆的半径 Point *p; p=new Point(x,y); p->Display(); p=new Circle(x,y,r); p->Display(); return 0; } 说明:圆周率PI的取值为3.14 提示:Display应设计为虚函数 Input Output Sample Input 0 0 1 Sample Output Point(0,0) Circle's center:Point(0,0) Radius:1 Area:3.14 Perimeter:6.28 **************************************************************** #include C++实验报告 实验4 类与对象 一、实验目的 1、掌握类的声明和使用 2、掌握类的声明和对象的声明 3、复习具有不同访问属性的成员的访问方式 4、观察构造函数和析构函数的执行过程 5、学习类的组合使用方法 6、使用DEBUG调试功能观察程序流程,跟踪观察类的构造函数、析构函数、成员函数的执行顺序 二、实验任务 1、声明一个CPU类,包含等级rank、频率frequency、电压voltage等属性,有两个公有成员函数run、stop。其中,rank为枚举类型CPU-Rank,声明为enum CPU-Rank{P1=1,P2,P3,P4,P5,P6,P7}, frequency为MHz的整数型,voltage为浮点型的电压值。观察构造函数好析构函数的调用顺序。 2、声明一个简单的Computer类,有数据成员芯片cpu、内存ram、光驱cdrom 等,有两个公有成员函数run、stop。cpu为CPU类的一个对象,ram为RAM 类的一个对象,cdrom为CDROM类的一个对象,声明并实现这个类。 3、设计一个用于人事管理的People类。考虑到通用性,这里只抽象出所有类型人员都具有的属性:number编号、sex性别、birthday出生日期、id身份证号等。其中出生日期声明为一个日期类内嵌子对象。用成员函数实现对人员信息的录入和显示。要求包括:构造函数和析构函数、拷贝构造函数、内嵌成员函数、组合。 三、实验内容 任务1:首先声明枚举类型,在这里出现了知识性错误,不清楚具体应如何声明,经查询相关书籍,知道应在类外进行声明。初次用类来进行编程,在概念上是有一些混乱的,例如构造函数和析构函数的调用顺序等。在用debug单步调试后,明白其中道理。 源程序: //Lab4_1.cpp #include 实验报告类的重载继承和多态 篇一:实验三_类的重载继承和多态_() 篇二:实验三_类的重载继承和多态 篇三:C++实验报告(类和对象重载与继承多态和模板异常和流) C++实验报告 目录 C++实验报告 ................................................ ................................................... (4) 实验一:类和对象 ................................................ ................................................... . (4) 1................................................. ................................................... . (4) 代码 ................................................ ................................................... .. (4) 运行结果 ................................................ ................................................... (5) 2.................................................. ................................................... (5) 思路: .............................................. ................................................... . (5) 代码 ................................................ ................................................... (5) 运行结果 ................................................ ................................................... 实验九类和对象的使用实验报告 一实验目的 1、学会用构造函数对类对象进行初始化 2、掌握析构函数,并了解构造函数和析构函数的调用顺序 3、了解对象数组和对象指针的用法 4、学会共用数据的保护,了解常对象、常成员函数等的使用限制 二实验内容和要求 1.回顾课本知识,掌握重点和难点,认真分析例题熟悉本章内容。 2.完成本章课后习题2、6、7题,认真分析每一题的代码。 三实验环境 Visual C++6.0开发环境 四源程序 2、 #include Date::Date() { month=1; day=1; year=2005; } void Date::display() { cout< 重写是指重写基类的方法,在基类中的方法必须有修饰符virtual,而在子类的方法中必须指明override。 格式: 基类中: public virtual void myMethod() { } 子类中: public override void myMethod() { } 重写以后,用基类对象和子类对象访问myMethod()方法,结果都是访问在子类中重新定义的方法,基类的方法相当于被覆盖掉了。 重载 用于在给定了参数列表和一组候选函数成员的情况下,选择一个最佳函数成员来实施调用。 public void test(int x,int y){} public void test(int x,ref int y){} public void test(int x,int y,string a){} 重载特征: I.方法名必须相同 II.参数列表必须不相同,与参数列表的顺序无关 III.返回值类型可以不相同 ========================= 但如果有泛型,就要注意了! 多态 c#的多态性主要体现在类的继承上: 子类继承父类的时候,可能出现同名但方法定义不同的情况, 所以在子类中会将原方法覆盖,实现自身的要求. using System; class Employee { virtual public void CalculatePlay() { Console.WriteLine("Employee"); } }; class SalariedEmployee: Employee { override public void CalculatePlay() { Console.WriteLine("Salary"); } }; class PolyApp { public static void Main() { Employee baseE1 = new Employee(); baseE1.CalculatePlay(); Employee baseE2 = new SalariedEmployee(); baseE2.CalculatePlay(); SalariedEmployee s = new SalariedEmployee(); s.CalculatePlay(); 实验报告_实验3 类与对象(学生学号_姓 名) 一、实验目的 1.熟悉类的组成,掌握类的声明方法; 2.理解构造方法的作用,并掌握构造方法的定义; 3.熟练使用访问器和设置器实现信息隐藏和封装; 4.熟悉一般方法、构造方法的重载; 5.能够正确地区分静态变量与实例变量、静态方法与实例方法的不同,掌握静态变量和静态方法的使用;6.掌握对象的创建、引用和使用及向方法传递参数的方式; 7.掌握this关键字的使用以及对象数组的创建和访问; 8.掌握Java包的创建、包成员的各种访问方式; 9.掌握一维数组:声明,创建,初始化,数组元素的访问; 10.掌握多维数组的概念:二维数组的声明,初始化,元素的访问。 二、实验内容与步骤 1.请回答下列问题: (1)Cirecle类定义了几个属性?它们的类型、访问权限各为什么? 答:两个PI,floatl类型,静态私有权限 Radius,float;类型,私有权限 (2)类中的“PI”的值可以在程序的方法中更改吗? 答:不可以,因为PI为静态变量 (3)Cirecle类定义了几个方法?它们的访问权限怎样? 答:四个,getRadius(),setRadius(float radius),getPerimeter(),getArea()都是公有权限 2.写出Rectangle类的程序代码: class Rectangle { private float width; private float length; public float getWidth( ) //获取矩形宽度 {return width;} public float getLength( ) //获取矩形长度 {return length;} public float getPerimeter( ) //获取矩形周长 {return 2*(width+length);} public float getArea( ) //获取矩形面积 {return (width*length);} public void setWidth(float w) //设置矩形宽度 {width=w;} public void setLength(float l) //设置矩形长度 {length=l;} } 3.回答下列问题: (1)该程序中有几个类?主类是什么?如果将这两个类放在一个文件中,源程序文件名应是什么?答:两个类:Circle、CircleTest;主类是CircleTest;源程序文件名是CircleTest。 实验四数组、指针与字符串 1.实验目的 1.学习使用数组 2.学习字符串数据的组织和处理 3.学习标准C++库的使用 4.掌握指针的使用方法 5.练习通过Debug观察指针的内容及其所指的对象的内容 6.联系通过动态内存分配实现动态数组,并体会指针在其中的作用 7.分别使用字符数组和标准C++库练习处理字符串的方法 2.实验要求 1.编写并测试3*3矩阵转置函数,使用数组保存3*3矩阵。 2.使用动态内存分配生成动态数组来重新完成上题,使用指针实现函数的功能。 3.编程实现两字符串的连接。要求使用字符数组保存字符串,不要使用系统函数。 4.使用string类定义字符串对象,重新实现上一小题。 5.定义一个Employee类,其中包括姓名、街道地址、城市和邮编等属性,以及change_name()和display()等函数。Display()显示姓名、街道地址、城市和邮编等属性,change_name()改变对象的姓名属性。实现并测试这个类。 6.定义包含5个元素的对象数组,每个元素都是Employee类型的对象。 7. (选做)修改实验4中的选做实验中的people(人员)类。具有的属性如下:姓名char name[11]、编号char number[7]、性别char sex[3]、生日birthday、身份证号char id[16]。其中“出生日期”定义为一个“日期”类内嵌对象。用成员函数实现对人员信息的录入和显示。要求包括:构造函数和析构函数、拷贝构造函数、内联成员函数、聚集。在测试程序中定义people类的对象数组,录入数据并显示。 3.实验内容及实验步骤 1.编写矩阵转置函数,输入参数为3*3整形数组,使用循环语句实现矩阵元素的行列对调,注意在循环语句中究竟需要对哪些元素进行操作,编写main()函数实现输入、输出。程序名:lab6_1.cpp。 2.改写矩阵转置函数,参数为整型指针,使用指针对数组元素进行操作,在main()函数中使用new操作符分配内存生成动态数组。通过Debug观察指针的内容及其所指的对象中的内容。程序名:lab6_2.cpp。 3.编程实现两字符串的连接。定义字符数组保存字符串,在程序中提示用户输入两个字符串,实现两个字符串的连接,最后用cout语句显示输出。程序名:lab6_3.cpp。用cin实现输入,注意,字符串的结束标志是ASCII码0,使用循环语句进行字符串间的字符拷贝。 4.使用string类定义字符串对象,编程实现两字符串的连接。在string类中已重载了运算符“+=”实现字符串的连接,可以使用这个功能。程序名:lab6_4.cpp。 5.在employee.h文件中定义Employee类。Employee类具有姓名、街道地址、城市和邮编等私有数据成员,在成员函数中,构造函数用来初始化所有数据成员;display()中使用cout显示 一:选择题 1. 下面有关析构函数的说法中,不正确的是( ) A.析构函数中不可包含Return语句 B.一个类中只能有一个析构函数 C.用户可定义有参析构函数 D.析构函数在对象被撤销时,被自动调用 2.派生类不可以访问基类的( ) A.Public成员B.Private成员 C.Protected成员D.Protected internel成员 3.有关sealed修饰符,描述正确的是( ) A.密封类可以被继承 B.abstract修饰符可以和sealed修饰符一起使用 C.密封类不能实例化 D.使用sealed修饰符可保证此类不能被派生 4.若想从派生类中访问基类的成员,可以使用( ) A.this关键字B.me关键字 C.base关键字D.override关键字 5.下面有关派生类的描述中,不正确的是( ) A.派生类可以继承基类的构造函数 B.派生类可以隐藏和重载基类的成员 C.派生类不能访问基类的私有成员 D.派生类只能有一个直接基类 6.C#中,继承具有( ),即A类派生B类,B类又派生C类,则C类会继承B类中的成员和A类中的成员。 A.传递性B.多态性C.单继承D.多继承 7.下面有关静态方法的描述中,错误的是( ) A.静态方法属于类,不属于实例 B.静态方法可以直接用类名调用 C.静态方法中,可以定义非静态的局部变量 D.静态方法中,可以访问实例方法 8.下面关于运算符重载的描述中,错误的是( ) A.重载的运算符仍然保持其原来的操作数个数、优先级和结合性不变 B.可以重载双目运算符,不可以重载单目运算符 C.运算符重载函数必须是public的 D.运算符重载函数必须是static的 9.下面对派生类和基类的关系的描述中,不正确的是( ) A.派生类的方法可以和基类的方法同名 B.派生类是对基类的进一步扩充 C.派生类也可作另一个派生类的基类 D.派生类继承基类的公有、保护和私有成员 10.下面关于虚方法的描述中,正确的是() A.虚方法可以实现静态联编 B.在一个程序中,不能有同名的虚方法 C.虚方法必须是类的静态成员 Java多态 1. Java中除了static和final方法外,其他所有的方法都是运行时绑定的。private 方法都被隐式指定为final的,因此final的方法不会在运行时绑定。当在派生类中重写基类中static、final、或private方法时,实质上是创建了一个新的方法。 2.在派生类中,对于基类中的private方法,最好采用不同的名字。 3.包含抽象方法的类叫做抽象类。注意定义里面包含这样的意思,只要类中包含一个抽象方法,该类就是抽象类。抽象类在派生中就是作为基类的角色,为不同的子类提供通用的接口。 4.对象清理的顺序和创建的顺序相反,当然前提是自己想手动清理对象,因为大家都知道Java垃圾回收器。 5.在基类的构造方法中小心调用基类中被重写的方法,这里涉及到对象初始化顺序。 6.构造方法是被隐式声明为static方法。 7.用继承表达行为间的差异,用字段表达状态上的变化。 在JAVA中有两种多态是指:运行时多态和编译时多态。 关于类的多态性简介如下: 多态(polymorphism)意为一个名字可具有多种语义.在程序设计语言中,多态性是指”一种定义,多种实现”.例如,运算符+有多种含义,究竟执行哪种运算取决于参加运算的操作数类型: 1+2 //加法运算符 “1” + “2” //字符串连接运算,操作数是字符串 多态性是面向对象的核心特征之一,类的多态性提供类中成员设计的灵活性和方法执行的多样性. 1、类多态性表现 (1)方法重载 重载表现为同一个类中方法的多态性.一个类生命多个重载方法就是为一种功能提供多种实现.编译时,根据方法实际参数的数据类型\个数和次序,决定究竟应该执行重载方法中的哪一个. (2)子类重定义从父类继承来的成员 当子类从父类继承来的成员不适合子类时,子类不能删除它们,但可以重定义它们,使弗雷成员适应子类的新需求.子类重定义父类成员,同名成员在父类与子类之间表现出多态性,父类对象引用父类成员,子类对象引用子类成员,不会产生冲突和混乱. 子类可重定义父类的同名成员变量,称子类隐藏父类成员变量.子类也可以重定义父类的同名成员方法,当子类方法的参数列表与父类方法参数列表完全相同时,称为子类方法覆盖 浙江理工大学信息学院 面向对象程序设计实验报告 实验名称:类的定义与使用学时安排:3 实验类别:设计性实验实验要求:1人1组姓名:邵旸珂学号:2016329621068  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄一、实验目的 1)掌握类的概念、类的定义格式、类与结构的关系、类的成员属性和类的封装性; 2)掌握类对象的定义; 3)理解类的成员的访问控制的含义,公有、私有和保护成员的区别; 4)掌握构造函数和析构函数的含义与作用、定义方式和实现,能够根据要求正确定义和重载构造函数。能够根据给定的要求定义类并实现类的成员函数; 二、实验原理介绍 通过建立类及对象,用类的成员函数和对象访问类的成员; 利用建立类的构造函数,完成类的成员的初始化工作; 三、实验设备介绍 软件需求: windows或linux下的c++编译器 硬件需求: 对于硬件方面的要求,建议配置是Pentium III 450以上的CPU 处理器,64MB以上的内存,200MB的自由硬盘空间、CD-ROM驱动器、能支持24位真彩色的显示卡、彩色显示器、打印机。 四、实验内容 编写一个程序,模拟电梯的功能。功能接口包括电梯上行按钮、下行按钮、楼层选择和电梯在行驶过程中的楼层显示。 要求: 1.由用户选择按上行按钮还是下行按钮,选择操作后再由用户输入要进入的楼层,进而电梯开始运行,显示所到的每一楼层层数。 2.如果是上行,则选择输入的楼层号不能比当前楼层号小,否则应给出不合法提示。 3. 如果是下行,则选择输入的楼层号不能比当前楼层号大,否则应给出不合法提示。 4.电梯一旦开始运作就会始终运行,直到窗口关闭。 5.电梯在经过不同楼层时,最好每个楼层的显示之间能有延迟,最终停靠的楼层的输出形式能更加醒目。如果可以,在电梯最初开始运行时,能在电梯由内部显示当前日期(提示:实现这些功能时,需要调用系统api,实现时间显示功能可以使用CDate类)。 五程序清单 #include 实验5 运算符重载和多态性班级学号(最后两位)姓名成绩 一、实验目的 1.掌握用成员函数重载运算符的方法 2.掌握用友元函数重载运算符的方法 3.理解并掌握利用虚函数实现动态多态性和编写通用程序的方法 4.掌握纯虚函数和抽象类的使用 二、实验内容 1.复数类加减法乘除运算(用成员函数定义运算符重载)。 复数类的定义: class complex //复数类声明 { public: //外部接口 complex(double r=0.0,double i=0.0) //构造函数 {real=r,imag=i;} complex operator +(complex c2); //运算符"+"重载成员函数 complex operator - (complex c2); //运算符"-"重载成员函数 complex operator *(complex ); //运算符"*"重载成员函数 complex operator /(complex); //运算符"/"重载成员函数 complex operator =(complex c2); //运算符"="重载成员函数 void display(); //输出复数 private: //私有数据成员 double real; //复数实部 double imag; //复数虚部 }; 实验代码: #include 继承、多态,重载、重写的区别与总结 李氏原则: (1)父类的引用指向子类对象。 -多态 (2)接口的引用指向实现类的实例。-接口 Polo咯, 什么是多态?它的实现机制是什么呢?重载和重写的区别在那里?这就是这一次我们要回顾的四个十分重要的概念:继承、多态、重载和重写 继承(inheritance) 简单的说,继承就是在一个现有类型的基础上,通过增加新的方法或者重定义已有方法(下面会讲到,这种方式叫重写)的方式,产生一个新的类型。继承是面向对象的三个基本特征--封装、继承、多态的其中之一,我们在使用JAVA 时编写的每一个类都是在继承,因为在JAVA语言中,https://www.360docs.net/doc/a58314697.html,ng.Object类是所有类最根本的基类(或者叫父类、超类),如果我们新定义的一个类没有明确地指定继承自哪个基类,那么JAVA就会默认为它是继承自Object类的。 我们可以把JAVA中的类分为以下三种: 类:使用class定义且不含有抽象方法的类。 抽象类:使用abstract class定义的类,它可以含有,也可以不含有抽象方法。接口:使用interface定义的类。 在这三种类型之间存在下面的继承规律: 类可以继承(extends)类,可以继承(extends)抽象类,可以继承(implements)接口。 抽象类可以继承(extends)类,可以继承(extends)抽象类,可以继承(implements)接口。 接口只能继承(extends)接口。 请注意上面三条规律中每种继承情况下使用的不同的关键字extends和implements,它们是不可以随意替换的。大家知道,一个普通类继承一个接口后,必须实现这个接口中定义的所有方法,否则就只能被定义为抽象类。我在这里之所以没有对implements关键字使用“实现”这种说法是因为从概念上来说它也是表示一种继承关系,而且对于抽象类implements接口的情况下,它并不是一定要实现这个接口定义的任何方法,因此使用继承的说法更为合理一些。 以上三条规律同时遵守下面这些约束: 类和抽象类都只能最多继承一个类,或者最多继承一个抽象类,并且这两种情况是互斥的,也就是说它们要么继承一个类,要么继承一个抽象类。 类、抽象类和接口在继承接口时,不受数量的约束,理论上可以继承无限多个接 Java的多态性 面向对象编程有三个特征,即封装、继承和多态。 封装隐藏了类的内部实现机制,从而可以在不影响使用者的前提下改变类的内部结构,同时保护了数据。 继承是为了重用父类代码,同时为实现多态性作准备。那么什么是多态呢? 方法的重写、重载与动态连接构成多态性。Java之所以引入多态的概念,原因之一是它在类的继承问题上和C++不同,后者允许多继承,这确实给其带来的非常强大的功能,但是复杂的继承关系也给C++开发者带来了更大的麻烦,为了规避风险,Java只允许单继承,派生类与基类间有IS-A的关系(即“猫”is a “动物”)。这样做虽然保证了继承关系的简单明了,但是势必在功能上有很大的限制,所以,Java引入了多态性的概念以弥补这点的不足,此外,抽象类和接口也是解决单继承规定限制的重要手段。同时,多态也是面向对象编程的精髓所在。 要理解多态性,首先要知道什么是“向上转型”。 我定义了一个子类Cat,它继承了Animal类,那么后者就是前者是父类。我可以通过 Cat c = new Cat(); 实例化一个Cat的对象,这个不难理解。但当我这样定义时: Animal a = new Cat(); 这代表什么意思呢? 很简单,它表示我定义了一个Animal类型的引用,指向新建的Cat类型的对象。由于Cat是继承自它的父类Animal,所以Animal类型的引用是可以指向Cat类型的对象的。那么这样做有什么意义呢?因为子类是对父类的一个改进和扩充,所以一般子类在功能上较父类更强大,属性较父类更独特, 定义一个父类类型的引用指向一个子类的对象既可以使用子类强大的功能,又可以抽取父类的共性。 所以,父类类型的引用可以调用父类中定义的所有属性和方法,而对于子类中定义而父类中没有的方法,它是无可奈何的; 实验一类和对象 实验课程名:面向对象程序设计(C++) 专业班级:学号:姓名: 实验时间:实验地点:指导教师: 一、实验目的和要求 (1) 理解类和对象的概念,掌握声明类和定义对象的方法。 (2) 掌握构造函数和析构函数的实现方法。 (3) 初步掌握使用类和对象编制C++程序。 (4) 掌握对象数组、对象指针和string类的使用方法。 (5) 掌握使用对象、对象指针和对象引用作为函数参数的方法。 (6) 掌握类对象作为成员的使用方法。 (7) 掌握静态数据成员和静态成员函数的使用方法。 (8) 理解友元的概念和掌握友元的使用方法。 二、实验内容 1.设计一个静态数组存储结构的顺序表类,要 求编程实现如下任务:建立一个线性表,首先 依次输人数据元素1,2,3,…,10,然后删除 数据元素6,最后依次显示当前线性表中的数 据元素。要求采用顺序表实现,假设该顺序表 的数据元素个数在最坏情况下不会超过50个。实验代码:#include SeqList( ) {length=0;} //无参构造函数 SeqList(T a[ ], int n); //有参构造函数 ~SeqList( ) { } //析构函数为空 int Length( ) {return length;} //求线性表的长度 T Get(int i); //按位查找,取线性表的第i个元素 int Locate(T x ); //按值查找,求线性表中值为x的元素序号 void Insert(int i, T x); //在线性表中第i个位置插入值为x的元素 T Delete(int i); //删除线性表的第i个元素 void PrintList( ); //遍历线性表,按序号依次输出各元素 private: T data[MaxSize]; //存放数据元素的数组 int length; //线性表的长度 }; template 计算机科学与技术实验报告 实验二类和对象(1) 姓名:易XX 班级:计科二班学号:2015110121 实验目的:深入理解类和对象,学会定义类,申明私有、公有变量,学会定义对象,并调用成员函数,解决实际问题。 实验内容: (一)、题目要求: 定义一个描述角度的类CAngle,包含的内容如下: (1)私有成员变量value,表示角度,类型为double; (2)公有成员变量SetValue,实现功能是使用形参为value赋值。 声明为:viod SetValue(double); (3)公有成员函数GetCos,实现功能计算余弦值,并作为返回值返回。 声明为 double GetCos(); 编程实现如下功能:定义一个Cangle类的对象deg,调用成员函数设置deg的角度为30度,调用成员函数计算并输出deg的余弦值。 代码: #include 第13卷第1期广州航海高等专科学校学报 Vol .13 No .1 2005年6月 JOURNAL OF G UANGZ HOU MAR I TI M E COLLEGE Jun .2005 文章编号:1009-8526(2005)01-0055-03 C++语言中多态性的分析 江勇驰 (广州航海高等专科学校交通运输管理系,广东广州510725) 摘 要:通过分析C++语言多态性的各种形式、特征及其在程序设计中的应用,说明多态性是对相似问题求解的有效方法. 关键词:C++;多态性;面向对象;虚函数中图分类号:TP311.1 文献标识码:A 收稿日期:2005-03-10 作者简介:江勇驰(1972-),男,助理馆员,主要从事自动化与计算机的实验教学和管理. C++语言具有数据封装、继承及多态性三大特征[1] ,多态性同时考虑了类的数据封装与继承关系的设计,是C++最重要的特征.在程序中多态性是指同一符号或名字在不同情况下代表不同但相似的功能[2] ,是对相似问题的一种求解方法.本文主要分析C++语言的多态性支持在程序设计中的应用. 1 实现形式及其应用 在C++面向对象程序设计中,实现多态性有两 种基本形式:编译时多态性和运行时多态性[3] .编译时多态性是指在程序编译阶段即可确定下来的多态性,包括强制多态和重载多态两种形式.运行时多态性是指必须等到程序动态运行时才可确定的多态性,主要通过继承结合动态绑定获得,分别体现在包含多态与类型参数化多态两方面. 1.1 强制多态 当表达式中存在不同类型的操作数时,为对此表达式进行求值,编译程序需要对其中的部分操作数强制进行类型转换,以保证运算符两边的操作数类型一致,但体现出来的却是完成了不同类型操作数间的运算,这就是C++中的强制多态性.C++中,“1+2”表示整数的加法,“1.0+2.0”表示浮点数的相加,而“1.0+2”需要作类型转换,实际进行浮点数加法,但却表示整数与浮点数的相加.这两种运算的内部实现是不同的,而且效率相差很大,不便用不同的符号表达.同一个运算符“+”可以同时具有不 同但相似的运算含义,体现的就是强制多态性 [3] . C++中规定了基本数据类型之间的转换规则:如果 运算符两边的操作数类型运算不一致,则总是将取值范围的最大值较小的类型转换为取值范围的最大值较大的类型,取值范围从大到小分别是:l ong double,double,fl oat,unsigned l ong,l ong,unsigned 和int .正是由于这种多态性,才简化了程序设计,可以 按相同的逻辑处理各种数据的加法.不过C ++中,强制多态性是有限的,不能用这一方法去解决许多类似问题.重载多态提供了另外一种途径. 1.2 重载多态 重载多态主要通过使用重载机制获得,包括函数重载和运算符重载两大类. 运算符重载允许重新定义C ++语言已有的运算符,以一种更加自然的方式使用自己定义的类类型.例如,加法运算符“+”表示整数或浮点数的加法,如果用户定义了一个复数类Comp lex,在类定义中对加法运算符“+”进行了重载,定义实现复数相加的操作Co mp lex operat or +(const Comp lex&oth 2er ){...},那么使用复数类声明两个对象Comp lex obj1,obj2;后,就可以直接使用obj1+obj2表示对 复数求和的操作,使得程序语言更接近习惯用法.C++语言中颇具典型的例子就是插入符“<<”和 提取符“>>”的重载.在C 语言中,利用库函数 p rintf ()输出或scanf ()输入时需要用参数指明输出或输入的数据类型方可正确输出或输入,而在C++ 多态 0.英语单词 1.为什么使用多态 1)问题的由来 需求变更 宠物系统中添加主人给宠物喂食功能,具体需求如下: ?给Dog喂食,其健康值增加3,输出吃饱的信息 ?给Penguin喂食,其健康值增加5,输出吃饱的信息 分析 1)给抽象类Pet增加抽象方法eat()方法; 2)让Dog类重写Pet类的eat()方法,实现狗狗吃饭功能; 3)让Penguin类重写Pet类的eat()方法,实现企鹅吃饭功能 4)创建主人类Master,添加feed(Dog dog)方法,调用Dog类的eat()方法,实现狗狗的 喂养;添加feed(Penguin penguin)方法,调用Penguin类的eat()方法,实现企鹅的喂 养。 5)创建测试类Test,在类中创建主人、狗狗和企鹅对象,调用相应方法实现主人喂养 宠物的功能 实例1:Pet.java Dog.java Penguin.java Master.java Test.java 从实例的运行结果看,我们已经顺利实现了主人给宠物喂食的功能,但是,如果主人又领养了一只猫或更多的宠物,该如何实现给宠物喂食呢? 当然你可以添加一个Cat类,让其继承Pet类,重写eat()方法;然后在Master类中重载feed()方法,添加一个feed(Cat cat)方法。可是,如果添加更多的宠物呢,这样做的缺点是:代码频繁修改(每次都要修改Master类,添加feed()的重载方法),可扩展性、可维护性差(如果领养的宠物过多,Master类中就会有很多重载的feed()方法)。 2)怎么解决问题 如果能实现如下效果就好了:Master类中只有一个feed()方法,可以实现多有宠物的喂食,不管领养多少宠物,都不用修改Master类源码。 答案是肯定的,通过多态实现该效果。 实验名称:类与对象 一.实验目的: (1)理解C#语言是如何体现面向对象编程基本思想; (2)掌握类对象的定义; (3)了解类的封装方法,以及如何创建类和对象; (4)了解成员变量和成员方法的特性; (5)掌握静态成员的用法; (6)掌握构造函数和析构函数的含义与作用、定义方式和实现,能够根据要求正确定义和重载构造函数。能够根据给定的要求定义类并实现类的成员函数; (7)掌握参数传递的用法; (8)掌握属性的作用和使用。 二.上机内容: 1)创建MyDataTime类,熟悉构造函数、析构函数的定义方法、属性的定义方法以及一般方法的定义过程。 (2)创建Fraction类,掌握运算符重载、静态方法的使用及其与实例方法的区别。(3)创建Swap类,掌握C#方法中参数的传递。 (4)整理上机步骤,总结经验和体会。 (4)完成实验报告。 四.上机步骤: 类的创建与应用: 创建一个MyDataTime类,要求如下: (1)私有字段:year,month,day; (2)属性:Year,Month,Day。注意在定义Month和Day的settor时要检验设置值的有效性,其中,,同时在对Day进行设置的时候要注意闰年和平 年的2月的天数。 (3)方法:构造函数:根据需求确定不同参数列表的构造方法。 析构函数:提示析构对象。 PrintMyDataTime:以“2011/4/24”、“2011年4月24日”、“2011.4.24”、“二〇一一年四月二十四日”的形式输出Year,Month和Day。 using System; using ; namespace ConsoleApplication1 { class MyDataTime { private int year; public int Year { set { year = value; } get { return year; } 浙江大学城市学院实验报告课程名称面向对象程序设计 实验项目名称类的设计与封装实验(一) 学生姓名专业班级学号 一. 实验目的和要求 1.掌握使用类将对象的属性与功能封装在类中的特点 2.掌握实例方法与构造方法 二. 实验内容 1. 分析Time类的设计 2. 分析并设计Product类 3. 分析并设计Fraction类 4. 设计Rectangle类 5. 设计Student类及其测试类School类 三. 实验结果与分析(可将程序运行结果截屏,也可分析运行结果) 1. 阅读以下关于Time类的代码,分析程序并回答相关的问题 import java.text.DecimalFormat; public class Time{ private int hour; private int minute; private int second; Time(){hour=0;minute=0;second=0;} Time(int h){ hour=h;minute=0;second=0;} Time(int h,int m){hour=h;minute=m;second=0;} Time(int h,int m,int s){hour=h;minute=m;second=s;} Time(Time time){ this.hour=time.getHour(); this.minute=time.getMinute(); this.second=time.getSecond(); } public int getHour(){return hour;} public int getMinute(){ return minute;}多态参考代码分析
C++实验报告 第四章 类与对象
实验报告类的重载继承和多态
C++实验九类和对象的使用实验报告
C#中区别多态、重载、重写的概念和语法结构
实验报告_实验3 类与对象
C上机实验报告实验四
继承与多态的习题
java多态
实验一.类与对象实验报告
c++运算符重载和多态性实验报告
继承、多态,重载、重写的区别与总结
java多态性
c++类和对象实验报告
C++类和对象实验报告
C++语言中多态性的分析
4.多态
实验报告4类与对象
类的设计与封装(一)实验报告