C++实验报告(类和对象 重载与继承 多态和模板 异常和流)
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
}
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<<"<";
{
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()
cin>>upperright.x>>upperright.y;
}
float Rectangle::area()
{
return (upperright.x-lowerleft.x)*(upperright.y-lowerleft.y);
}
int main()
{
Rectangle juxing;
juxing.get();
float area();//计算矩形面积
};
void Rectangle::get()
{
cout<<"输入坐标时:先输入横坐标,再输空格,再输入纵坐标\n\n";
cout<<"请输入矩形左下角坐标:";
cin>>lowerleft.x>>lowerleft.y;
cout<<"请输入矩形右上角坐标:";
using namespace std;
struct point
{
float x;
float y;
};
class Rectangle//矩形类
{
point lowerleft;//矩形左下角点的坐标
point upperright;//矩形右上角点的坐标
public:
void get();//输入矩形左下角点和右上角点的坐标
person p;//调用默认构造函数
p.show();
p=person(xie);
p.show();
p.input();
p.show();
return 0;
}
运行结果:
3.声明一个Cat类,拥有静态数据成员HowManyCats,记录Cat的个体数目;静态成员函数GetHowMany( ),获取HowManyCats。设计程序测试这个类,体会静态数据成员和静态成员函数的用法。
}
int main()
{
Cat a;
a.show();
Cat b;
b.show();
return 0;
}
运行结果如下:
实验二 重载和继承
1.实现如下字符串类String的各项功能,并编写测试程序。
class String{
private:
char *str;
public:
String(char *s=0);
编写函数代码时,在有关字符串的复制操作中使用strcpy()函数,在比较操作中使用strcmp()函数。重载*操作符后,可用于指向对象的指针。
代码如下:
#include<iostream>
#include<cstring>
#include<cstdlib>
using namespace std;
class String{
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构造函数的实现
静态成员函数只能访问静态数据成员。
代码如下:
#include <iostream>
using namespace std;
class Cat
{
private:
static int HowManyCats;
public:
Cat(){HowManyCats++;}
static int GetHowMany(){return HowManyCats;}
C++实验报告
C++
实验一:类和对象
实验目的:
能够根据软件需要,对客观实体进行抽象(封装)和代码实现。
实验环境:
Visual C++ 6.0
实验内容:
1.设计并测试一个名为Rectangle的矩形类,其属性为矩形的左下角与右上角两个点的坐标,
能计算矩形的面积。
代码如下:
#include<iostream>
思路:
默认HowManyCats为0。在类Cat的构造函数里将HowManyCats加1,用函数GetHowMany( )返回HowManyCats的值。创建Cat类的对象a,此时HowManyCats变为1。再创建对象b,在创建对象a后的HowManyCats基础上加1,变成2。说明类的所有对象共享同一个静态类成员。
~person(){} //析构函数
person(person &p); //拷贝构造函数
void input(); //信息输入,内联函数
void show(); //信息输出,内联函数
};
date::date(int y,int m, int d) //date类构造函数的实现
{
year=y;
month=m;
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); //拷贝字符串
{
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=p.name;
birthday=p.birthday;
operator const char *(void)const;
~String();
};
这题我写的的代码不好,请参考《C++Primer Plus第五版》第十二章
思路:
表示字符串的方式有三种:char数组;用引号括起的字符串常量;被设置为字符串的地址的char指针。在本题的类String中,成员str是一个char指针,被设置为字符串的地址。
String s3(s1);//拷贝构造函数
cerr<<"s1:";
思路:
构造函数包括默认构造函数、带参构造函数、拷贝构造函数,在对象创建时调用构造函数,当用一个已存在的类实例去初始化另一个新创建的类实例时,系统会调用拷贝构造函数。在对象消除时调用析构函数。内联函数使用inline标识,在编译阶段,内联函数的函数体代码部分会被嵌入到每一个调用语句处,在程序执行阶段,不会发生程序的控制转移,而是直接运行在编译时嵌入的代码。
cout<<"身份证号: ";
cin>>ID;
cout<<endl<<"人员信息录入已完成!\n\n";
}
inline void person::show() //信息输出函数
{
cout<<"人员信息显示如下:"<<endl;
cout<<"姓名:"<<name<<endl;
cout<<"编号:"<<num<<endl;
代码如下:
#include <iostream>
#include <string>
using namespace std;
class date //日期类
{
int year,month,day;
public:
date(){year=0;month=0;day=0;} //默认构造函数
date(int y,int m,int d) ; //带参构造函数
{
cerr<<"调用析构函数"<<endl;
delete []str;
}
String::display()
{
//cerr<<"字符串为:";
puts(str);
}
int main()
{
char *p="abcdefg";
char *q="hijkl";
String s1(p);
String s2(q);
cout<<"性别:"<<sex<<endl;
cout<<"出生日期:";
birthday.out();
cout<<endl;
cout<<"身份证号:"<<ID<<endl<<endl;
}
int main()
{
date a(1990,1,1);
person xie("谢端阳",1,"男",a,"1234567890");//调用构造函数
~date(){} ; //析构函数
date(date &datep); //拷贝构造函数
void in() //数据输入函数
{ cin>>year>>month>>day; }
void out() //显示输出函数
{ cout<<year<<"年"<<month<<"月" <<day<<"日";}
String(const String&);
int strlenth(void)const;
int strcmpp(const String&)const; //比较字符串
String& operator=(const String&); //拷贝字符串
String& operator+=(const String&); //连接字符串
}
inline void person::input() //信息输入函数
{
cout<<"请输入个人信息"<<endl;
cout<<"姓名:";
cin>>name;
cout<<"编号:";
cin>>num;
cout<<"性别: ";
cin>>sex;
cout<<"出生日期:";
birthday.in();
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)
String& operator+=(const String&a); //连接字符串
operator const char *()const;
~String();
display();
wk.baidu.com};
String::String(char *s)//构造函数
{
if(s==NULL)
{
str=new char[1];
float result;
result=juxing.area();
cout<<"矩形面积为:"<<result<<endl;
return 0;
}
运行结果如下:
2.设计并测试一个“人员”类。属性包括:编号、性别、出生日期、身份证号等等。其中“出生日期”定义为一个“日期”类内嵌子对象。用成员函数实现对人员信息的录入和显示。要求包括:构造函数和析构函数、拷贝构造函数、内联成员函数。
};
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);//带参构造函数
void show();
};
int Cat::HowManyCats=0;
void Cat::show()
{
cout<<"There are "<<Cat::GetHowMany()<<" cats alive!"<<endl;//静态成员函数不能通过对象调用,不能使用this指针,如果静态成员函数是在公有部分声明,则可以使用类名和作用域解析符来调用它。
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<<"<";
{
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()
cin>>upperright.x>>upperright.y;
}
float Rectangle::area()
{
return (upperright.x-lowerleft.x)*(upperright.y-lowerleft.y);
}
int main()
{
Rectangle juxing;
juxing.get();
float area();//计算矩形面积
};
void Rectangle::get()
{
cout<<"输入坐标时:先输入横坐标,再输空格,再输入纵坐标\n\n";
cout<<"请输入矩形左下角坐标:";
cin>>lowerleft.x>>lowerleft.y;
cout<<"请输入矩形右上角坐标:";
using namespace std;
struct point
{
float x;
float y;
};
class Rectangle//矩形类
{
point lowerleft;//矩形左下角点的坐标
point upperright;//矩形右上角点的坐标
public:
void get();//输入矩形左下角点和右上角点的坐标
person p;//调用默认构造函数
p.show();
p=person(xie);
p.show();
p.input();
p.show();
return 0;
}
运行结果:
3.声明一个Cat类,拥有静态数据成员HowManyCats,记录Cat的个体数目;静态成员函数GetHowMany( ),获取HowManyCats。设计程序测试这个类,体会静态数据成员和静态成员函数的用法。
}
int main()
{
Cat a;
a.show();
Cat b;
b.show();
return 0;
}
运行结果如下:
实验二 重载和继承
1.实现如下字符串类String的各项功能,并编写测试程序。
class String{
private:
char *str;
public:
String(char *s=0);
编写函数代码时,在有关字符串的复制操作中使用strcpy()函数,在比较操作中使用strcmp()函数。重载*操作符后,可用于指向对象的指针。
代码如下:
#include<iostream>
#include<cstring>
#include<cstdlib>
using namespace std;
class String{
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构造函数的实现
静态成员函数只能访问静态数据成员。
代码如下:
#include <iostream>
using namespace std;
class Cat
{
private:
static int HowManyCats;
public:
Cat(){HowManyCats++;}
static int GetHowMany(){return HowManyCats;}
C++实验报告
C++
实验一:类和对象
实验目的:
能够根据软件需要,对客观实体进行抽象(封装)和代码实现。
实验环境:
Visual C++ 6.0
实验内容:
1.设计并测试一个名为Rectangle的矩形类,其属性为矩形的左下角与右上角两个点的坐标,
能计算矩形的面积。
代码如下:
#include<iostream>
思路:
默认HowManyCats为0。在类Cat的构造函数里将HowManyCats加1,用函数GetHowMany( )返回HowManyCats的值。创建Cat类的对象a,此时HowManyCats变为1。再创建对象b,在创建对象a后的HowManyCats基础上加1,变成2。说明类的所有对象共享同一个静态类成员。
~person(){} //析构函数
person(person &p); //拷贝构造函数
void input(); //信息输入,内联函数
void show(); //信息输出,内联函数
};
date::date(int y,int m, int d) //date类构造函数的实现
{
year=y;
month=m;
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); //拷贝字符串
{
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=p.name;
birthday=p.birthday;
operator const char *(void)const;
~String();
};
这题我写的的代码不好,请参考《C++Primer Plus第五版》第十二章
思路:
表示字符串的方式有三种:char数组;用引号括起的字符串常量;被设置为字符串的地址的char指针。在本题的类String中,成员str是一个char指针,被设置为字符串的地址。
String s3(s1);//拷贝构造函数
cerr<<"s1:";
思路:
构造函数包括默认构造函数、带参构造函数、拷贝构造函数,在对象创建时调用构造函数,当用一个已存在的类实例去初始化另一个新创建的类实例时,系统会调用拷贝构造函数。在对象消除时调用析构函数。内联函数使用inline标识,在编译阶段,内联函数的函数体代码部分会被嵌入到每一个调用语句处,在程序执行阶段,不会发生程序的控制转移,而是直接运行在编译时嵌入的代码。
cout<<"身份证号: ";
cin>>ID;
cout<<endl<<"人员信息录入已完成!\n\n";
}
inline void person::show() //信息输出函数
{
cout<<"人员信息显示如下:"<<endl;
cout<<"姓名:"<<name<<endl;
cout<<"编号:"<<num<<endl;
代码如下:
#include <iostream>
#include <string>
using namespace std;
class date //日期类
{
int year,month,day;
public:
date(){year=0;month=0;day=0;} //默认构造函数
date(int y,int m,int d) ; //带参构造函数
{
cerr<<"调用析构函数"<<endl;
delete []str;
}
String::display()
{
//cerr<<"字符串为:";
puts(str);
}
int main()
{
char *p="abcdefg";
char *q="hijkl";
String s1(p);
String s2(q);
cout<<"性别:"<<sex<<endl;
cout<<"出生日期:";
birthday.out();
cout<<endl;
cout<<"身份证号:"<<ID<<endl<<endl;
}
int main()
{
date a(1990,1,1);
person xie("谢端阳",1,"男",a,"1234567890");//调用构造函数
~date(){} ; //析构函数
date(date &datep); //拷贝构造函数
void in() //数据输入函数
{ cin>>year>>month>>day; }
void out() //显示输出函数
{ cout<<year<<"年"<<month<<"月" <<day<<"日";}
String(const String&);
int strlenth(void)const;
int strcmpp(const String&)const; //比较字符串
String& operator=(const String&); //拷贝字符串
String& operator+=(const String&); //连接字符串
}
inline void person::input() //信息输入函数
{
cout<<"请输入个人信息"<<endl;
cout<<"姓名:";
cin>>name;
cout<<"编号:";
cin>>num;
cout<<"性别: ";
cin>>sex;
cout<<"出生日期:";
birthday.in();
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)
String& operator+=(const String&a); //连接字符串
operator const char *()const;
~String();
display();
wk.baidu.com};
String::String(char *s)//构造函数
{
if(s==NULL)
{
str=new char[1];
float result;
result=juxing.area();
cout<<"矩形面积为:"<<result<<endl;
return 0;
}
运行结果如下:
2.设计并测试一个“人员”类。属性包括:编号、性别、出生日期、身份证号等等。其中“出生日期”定义为一个“日期”类内嵌子对象。用成员函数实现对人员信息的录入和显示。要求包括:构造函数和析构函数、拷贝构造函数、内联成员函数。
};
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);//带参构造函数
void show();
};
int Cat::HowManyCats=0;
void Cat::show()
{
cout<<"There are "<<Cat::GetHowMany()<<" cats alive!"<<endl;//静态成员函数不能通过对象调用,不能使用this指针,如果静态成员函数是在公有部分声明,则可以使用类名和作用域解析符来调用它。
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);