一、 实验目的
掌握类的定义及实例化
掌握类的几种构造函数和析构函数
掌握类的成员访问控制
二、实验内容
-
设计点类 Point,能够表示平面当中的任意点
(1)数据成员包括两点坐标(x,y),成员函数包括构造函数、析构函数、复制构造函数;
(2)包括求点的坐标的公有接口函数,打印点坐标的成员函数,并在主函数中调用。
(3)在主函数中实例化出两个点a(0,0),b(6,8),求出两点间的距离。 -
设计一个Student类
(1)基本信息:学号、姓名、性别、出生日期、院系、专业; 数据成员中:“日期”要声明为一个内嵌子对象
(2)Student类要包含:构造函数、内联成员函数、带默认参数的构造函数、复制构造函数
(3)成员函数基本功能有:
A)可以从键盘输入学生的基本信息;
B)定义一个函数setInfo(形参表),可以修改学生的一些基本信息函数,例如:姓名,学号可以作修改;
C)包括成员函数void show()显示学生信息;
【提示】 注意带默认参数值的构造函数的声明与定义; 从键盘输入基本信息,调用带参数的构造函数生成学生对象; 不同类型的信息须使用合理的变量类型,姓名、院系等可定义为字符串,使用string来定义。 -
定义一个Circle类,有数据成员radius(半径),成员函数getArea(),计算圆的面积,构造一个Circle的对象进行测试。
-
定义一个DataType(数据类型)类,能处理包含字符型、整型、浮点型三种类型的数据,给出其构造函数。
-
问答题:什么叫做复制构造函数?复制构造函数何时被调用?
-
定义一个复数类Complex,使得代码能够进行下面的工作:
Complex c2 = 4.5; //用实数4.5初始化c2
c1.add(c2); //将c1与c2相加,结果保存在c1中
c1.show(); //将c1输出(这时的结果应该是7.5+5i
- 设计内嵌点类对象的组合类——矩形类Rectangle,私有属性包含平面上矩形左下角的一个点Point px;和矩形的宽度、高度:int width,height;公有成员函数包含求矩形面积的函数;在主函数中测试这个组合类,创建对象并求其面积。
【提示】 组合类的设计可参照书中例题;构造函数的实现须使用初始化参数列表的形式。
三、实验步骤及结果
- 设计点类 Point,能够表示平面当中的任意点
(1)数据成员包括两点坐标(x,y),成员函数包括构造函数、析构函数、复制构造函数;
(2)包括求点的坐标的公有接口函数,打印点坐标的成员函数,并在主函数中调用。
(3)在主函数中实例化出两个点a(0,0),b(6,8),求出两点间的距离。
#include <iostream>
#include <cmath>
using namespace std;
class Point{
public:
Point(int x1,int y1){
x=x1;
y=y1;
}
Point(Point &a){
x=a.x;
y=a.y;
}
~Point(){}
void setX(int a){
x=a;
}
void setY(int a){
y=a;
}
void show(){
cout<<"("<<x<<","<<y<<")"<<endl;
}
double distance(Point a){
return sqrt((a.x-x)*(a.x-x) + (a.y-y)*(a.y-y));
}
private:
int x,y;
};
运行结果:
- 设计一个Student类
(1)基本信息:学号、姓名、性别、出生日期、院系、专业; 数据成员中:“日期”要声明为一个内嵌子对象
(2)Student类要包含:构造函数、内联成员函数、带默认参数的构造函数、复制构造函数
(3)成员函数基本功能有:
A)可以从键盘输入学生的基本信息;
B)定义一个函数setInfo(形参表),可以修改学生的一些基本信息函数,例如:姓名,学号可以作修改;
C)包括成员函数void show()显示学生信息;
【提示】 注意带默认参数值的构造函数的声明与定义; 从键盘输入基本信息,调用带参数的构造函数生成学生对象; 不同类型的信息须使用合理的变量类型,姓名、院系等可定义为字符串,使用string来定义。
#include <iostream>
#include <string.h>
using namespace std;
class Student{
public:
Student(){}
Student(Student &p){
xh=p.xh;strcpy(xm,p.xm);
strcpy(xb,p.xb);
strcpy(sr,p.sr);
strcpy(yx,p.yx);
strcpy(zy,p.zy);
}
void setID(int xh1,char xm1[20],char xb1[20],char sr1[20],char yx1[20],char zy1[20]){
xh=xh1;
strcpy(xm,xm1);
strcpy(xb,xb1);
strcpy(sr,sr1);
strcpy(yx,yx1);
strcpy(zy,zy1);
}
void show(){
cout<<"学号\t"<<"姓名\t"<<"性别\t"<<"出生日期\t"<<"院系\t\t"<<"专业"<<endl
<<xh<<"\t"<<xm<<"\t"<<xb<<"\t"<<sr<<"\t"<<yx<<"\t"<<zy<<endl;
}
void setInfo(){
int a;
char b[20];
cout<<"请输入修改后的学号、姓名:"<<endl;
cin>>a>>b;
xh=a;
strcpy(xm,b);
}
private:
int xh;
char xm[20];
char xb[20];
char sr[20];
char yx[20];
char zy[20];
};
int main(){
Student p;
p.setID(2021212,"张三","男","20010926","软件学院","软件工程");
p.show();
p.setInfo();
p.show();
return 0;
}
运行结果:
- 定义一个Circle类,有数据成员radius(半径),成员函数getArea(),计算圆的面积,构造一个Circle的对象进行测试。
#include <iostream>
#include <cmath>
using namespace std;
class Circle{
public:
Circle(double radius1){
radius = radius1;
}
double getArea(){
return radius*radius*3.1415926;
}
private:
double radius;
};
int main(){
Circle a(2);
cout<<"圆的面积为:"<<a.getArea()<<endl;
}
运行结果:
- 定义一个DataType(数据类型)类,能处理包含字符型、整型、浮点型三种类型的数据,给出其构造函数。
#include <iostream>
using namespace std;
class DataType{
public:
DataType(char c){
data.c = c;
type = CHAR;
}
DataType(int i){
data.i = i;
type = INT;
}
DataType(float f){
data.f = f;
type = FLOAT;
}
void show(){
switch (type){
case CHAR:
cout << data.c << endl;
break;
case INT:
cout << data.i << endl;
break;
case FLOAT:
cout << data.f << endl;
break;
default:
break;
}
}
private:
enum TYPE { CHAR, INT, FLOAT };
union DATA{
int i;
char c;
float f;
};
TYPE type;
DATA data;
};
int main(){
DataType a1('a');
a1.show();
DataType a2(66);
a2.show();
DataType a3(6.66f);
a3.show();
return 0;
}
运行结果:
- 问答题:什么叫做复制构造函数?复制构造函数何时被调用?
复制构造函数是只有单个形参, 且形参是对本类类型对象的引用的构造函数。
有3种情况会使用复制构造函数:
一个对象以值传递的方式传入函数体。
一个对象以值传递的方式从函数返回。
一个对象需要通过另外一个对象进行初始化。
6、定义一个复数类Complex,使得代码能够进行下面的工作:
Complex c2 = 4.5; //用实数4.5初始化c2
c1.add(c2); //将c1与c2相加,结果保存在c1中
c1.show(); //将c1输出(这时的结果应该是7.5+5i
#include <iostream>
using namespace std;
class Complex {
public:
Complex(double s=0,double x=0){
shi=s;xu=x;
}
void add(Complex a){
shi=shi+a.shi;
xu=xu+a.xu;
}
void show(){
cout<<shi<<"+"<<xu<<"i"<<endl;
}
private:
double shi,xu;
};
int main(){
Complex c1(3,5);
Complex c2 = 4.5;
c1.add(c2);
c1.show();
return 0;
}
运行结果:
- 设计内嵌点类对象的组合类——矩形类Rectangle,私有属性包含平面上矩形左下角的一个点Point px;和矩形的宽度、高度:int width,height;公有成员函数包含求矩形面积的函数;在主函数中测试这个组合类,创建对象并求其面积。 【提示】 组合类的设计可参照书中例题;构造函数的实现须使用初始化参数列表的形式。
#include <iostream>
using namespace std;
class Point {
public:
Point(int x1,int y1){
x=x1;
y=y1;
}
void show(){
cout<<"("<<x<<","<<y<<")"<<endl;
}
int getX(){
return x;
}
int getY(){
return y;
}
private:
int x,y;
};
class Rectangle {
public:
Rectangle(const Point& a,int w,int h):
px(a),width(w),height(h){}
int Area(){
return width*height;
}
int getW(){
return width;
}
int getH(){
return height;
}
void showP(){
px.show();
}
private:
Point px;
int width,height;
};
int main(){
Point a(2,4);
a.show();
Rectangle b(a,5,5);
cout<<"矩形b的面积为:"<<b.Area()<<endl;
return 0;
}
运行结果:
四、实验小结
问题与解决办法:
-
编译出错 :[Error] ‘sqrt’ was not declared in this scope
解决办法:运用sqrt函数需要头文件#include <math.h>。
-
编译出错,提示“[Error] expected before return”
解决办法:语句结束时的英文下的分号“;”输成了中文下的分号。改正后,错误消失。
-
编译出错,提示“ [Error] expected ‘;’ before ‘)’ token”
解决办法:for循环里的分号“;”写成了逗号“,”。改正后,错误消失。
心得体会:类好难,感谢老师与助教的细心讲解。