实验三 类和对象

实验三 类和对象

一、 实验目的

1.掌握类的定义及实例化

2.掌握类的几种构造函数和析构函数

3.掌握类的成员访问控制

二、实验内容

1、设计点类 Point,能够表示平面当中的任意点
(1)数据成员包括两点坐标(x,y),成员函数包括构造函数、析构函数、复制构造函数;
(2)包括求点的坐标的公有接口函数,打印点坐标的成员函数,并在主函数中调用。
(3)在主函数中实例化出两个点a(0,0),b(6,8),求出两点间的距离。

2、设计一个Student类
(1)基本信息:学号、姓名、性别、出生日期、院系、专业; 数据成员中:“日期”要声明为一个内嵌子对象
(2)Student类要包含:构造函数、内联成员函数、带默认参数的构造函数、复制构造函数
(3)成员函数基本功能有:
  A)可以从键盘输入学生的基本信息;
  B)定义一个函数setInfo(形参表),可以修改学生的一些基本信息函数,例如:姓名,学号可以作修改;
  C)包括成员函数void show()显示学生信息; 【提示】 注意带默认参数值的构造函数的声明与定义; 从键盘输入基本信息,调用带参数的构造函数生成学生对象; 不同类型的信息须使用合理的变量类型,姓名、院系等可定义为字符串,使用string来定义。

3、定义一个Circle类,有数据成员radius(半径),成员函数getArea(),计算圆的面积,构造一个Circle的对象进行测试。

4、定义一个DataType(数据类型)类,能处理包含字符型、整型、浮点型三种类型的数据,给出其构造函数。

5、问答题:什么叫做复制构造函数?复制构造函数何时被调用?

6、定义一个复数类Complex,使得代码能够进行下面的工作:

Complex c2 = 4.5;      //用实数4.5初始化c2
c1.add(c2);            //将c1与c2相加,结果保存在c1中
c1.show();             //将c1输出(这时的结果应该是7.5+5i    

7、设计内嵌点类对象的组合类——矩形类Rectangle,私有属性包含平面上矩形左下角的一个点Point px;和矩形的宽度、高度:int width,height;公有成员函数包含求矩形面积的函数;在主函数中测试这个组合类,创建对象并求其面积。 【提示】 组合类的设计可参照书中例题;构造函数的实现须使用初始化参数列表的形式。

三、实验步骤及结果

题目1

/*
程序名:题目1.cpp
功能:设计点类 Point,能够表示平面当中的任意点
(1)数据成员包括两点坐标(x,y),成员函数包括构造函数、析构函数、复制构造函数;
(2)包括求点的坐标的公有接口函数,打印点坐标的成员函数,并在主函数中调用。
(3)在主函数中实例化出两个点a(0,0),b(6,8),求出两点间的距离。
日期:2021.11.7
*/
#include <iostream>
#include <math.h>//为了调用sqrt函数需要写头文件 
using namespace std;
class Point
{
public:
	Point(int xx,int yy)
	{
		x=xx;
		y=yy;
	}//构造函数,给x,y赋参数的值 
	Point(Point& p)
	{
	x=p.x;
	y=p.y;
	};//复制构造函数 
	~Point(){}; //析构函数 
	int getX()
	{
		return x;	
	}//得到x的值 
	int getY()
	{
		return y;
	}//得到y的值 
	void printc(Point &p)
	{
		cout<<"("<<p.getX()<<","<<p.getY()<<")"<<endl;
	}//打印出坐标 
private:
	int x;//私有数据成员x
	int y;//私有数据成员y
};//定义点类 
void distance(Point &a, Point &b)
{
	int D = ((a.getX() - b.getX())*(a.getX() - b.getX()) + (a.getY() - b.getY())*(a.getY() - b.getY()));
	cout << "距离为:" << sqrt(D) << endl;
}//计算距离  其中调用sqrt平方根函数 
int main()
{
	Point a(0,0),b(6,8);//建立Point类的对象 
	a.printc(a);//打印出a的坐标 
	b.printc(b);//打印出b的坐标 
	distance(a,b);//算出ab之间的距离并打印 
	system("pause");
	return 0;
}

运行结果:

图片描述

题目2

/*
程序名:题目2.cpp
功能:2、设计一个Student类
(1)基本信息:学号、姓名、性别、出生日期、院系、专业; 数据成员中:“日期”要声明为一个内嵌子对象
(2)Student类要包含:构造函数、内联成员函数、带默认参数的构造函数、复制构造函数
(3)成员函数基本功能有:
  A)可以从键盘输入学生的基本信息;
  B)定义一个函数setInfo(形参表),可以修改学生的一些基本信息函数,例如:姓名,学号可以作修改;
  C)包括成员函数void show()显示学生信息; 【提示】 注意带默认参数值的构造函数的声明与定义; 
  从键盘输入基本信息,调用带参数的构造函数生成学生对象;
  不同类型的信息须使用合理的变量类型,姓名、院系等可定义为字符串,使用string来定义。
日期:2021.11.7
*/
#include <iostream>
#include <string>
using namespace std;
class Date
{

public:
	Date(){}//默认构造函数
	Date(int Y,int M,int D)
	{
		y = Y;
		m = M;
		d = D;
	}//含参构造函数
	void setD()
	{
		cin >> y >> m >> d;
	}//setD函数设置y m d的值
	void showD()
	{
		cout << y << "年" << m << "月" << d << "日" << endl;
	}//showD函数输出y年m月d日
private:
	int y, m, d;//私有数据成员y m d
};//Date类
class Student
{
public:
	Student(){}//默认构造函数
	Student(int a,string b,string c,Date g,string e,string f,int y,int m,int d):birth(y,m,d)
	{
		id = a;
		name = b;
		gender = c;
		faculty = e;
		profession = f;
	}//含参构造函数
	Student(Student &s)
	{
		id = s.id;
		name = s.name;
		gender = s.gender;
		birth = s.birth;
		faculty = s.faculty;
		profession = s.profession;
	}//复制构造函数
	void input(Student &s) 
	{
		cout << "请输入学生学号" << endl;
		cin >> s.id;
		cout << "请输入学生姓名" << endl;
		cin >> s.name;
		cout << "请输入学生性别" << endl;
		cin >> s.gender;
		cout << "请输入学生出生日期" << endl;
		birth.setD();
		cout << "请输入学生院系" << endl;
		cin >> s.faculty;
		cout << "请输入学生专业" << endl;
		cin >> s.profession;
	}//input函数输入学生信息
	void setInfo(Student &s)//setInfo用来修改信息 其中用了switch
	{
		cout << "请输入一个数字" << endl;
		cout << "修改学号请输入1" << endl;
		cout << "修改姓名请输入2" << endl;
		cout << "修改性别请输入3" << endl;
		cout << "修改出生日期请输入4" << endl;
		cout << "修改院系请输入5" << endl;
		cout << "修改专业请输入6" << endl;
		int i;
		cin >> i;
		switch (i)
		{
		case 1:
			{
				int a;
				cin >> a;
				s.id = a;
			}break;
		case 2:
			{
				string b;
				cin >> b;
				s.name = b;
			}break;
		case 3:
			{
				int c;
				cin >> c;
				s.gender = c;
			}break;
		case 4:
			{
				s.birth.setD();
			}break;
		case 5:
			{
				int d;
				cin >> d;
				s.faculty = d;
			}break;
		case 6:
			{
				int e;
				cin >> e;
				s.profession = e;
			}break;
		}
	}//用switch来修改对应信息
	void show(Student &s)
	{
		cout << "学生学号:" << s.id << endl;
		cout << "学生姓名:" << s.name << endl;
		cout << "学生性别:" << s.gender << endl;
		cout << "学生出生日期:";
		birth.showD();
		cout << "学生院系:" << s.faculty << endl;
		cout << "学生专业:" << s.profession << endl;
	}//show函数显示出学生信息

private://私有数据成员 
	int id;
	string name;
	string gender;
	Date birth;//Date类中的对象
	string faculty;
	string profession;
};//Student类
int main()
{
	Student s;//创建一个对象s
	s.input(s);//输入学生信息
	int i;
	cout << "您想要修改几项信息?不修改请输入0" << endl;
	cin >> i;
	for (int j = 0; j < i; j++)//用循环判断修改信息数目
	s.setInfo(s);
	s.show(s);//显示出信息
	return 0;
}

运行结果:

图片描述

题目3

/*
程序名:题目3.cpp
功能:定义一个Circle类,有数据成员radius(半径),成员函数getArea(),计算圆的面积,构造一个Circle的对象进行测试。
日期:2021.11.7
*/
#include <iostream>
using namespace std;
const double PI=3.14;//定义常量PI=3.14 
class Circle
{
public:
	int getr()
	{
		return radius;
	} //获取radius 
	void setr(int r)
	{
		radius=r;
	}//设置radius 
	void getArea()
	{
		double s=PI*radius*radius;
		cout << "半径为:"<< radius << endl;
		cout << "面积为:"<< s << endl;
	}//定义Area函数来输出半径 和计算后的面积   
private:
	int radius; //私有数据成员radius 
};//定义一个Circle类 
int main()
{
	Circle p;//创建一个对象p 
	p.setr(2);//赋值radius为2 
	p.getArea();//调用Area函数输出半径和面积 
	system("pause");
	return 0;
}

运行结果:

图片描述

题目4

/*程序名:题目4.cpp
功能:定义一个DataType(数据类型)类,能处理包含字符型、整型、浮点型三种类型的数据,给出其构造函数。
日期:2021.11.7
*/
#include <iostream>
using namespace std;
class DataType
{
	enum
	{
		character,integer,floating_point
	}type;//type是未命名的、不限定作用域的枚举类型中的变量 
	union
	{
		char c;
		int i;
		float f;	
	};//创建联合体 
public:
	DataType(int ii)
	{
		type=integer;
		i=ii;
	}//(整型)构造函数 
	DataType(char ch)
	{
		type=character;
		c=ch;
	}//(字符型)构造函数 
	DataType(float ff)
	{
		type=floating_point;
		f=ff;
	}//(浮点型)构造函数 
	void print(); //打印函数的声明 
};//定义一个DataType类 
void DataType::print()
{
	switch(type)
	{
		case character:
			cout<<"字符型:"<<c<<endl;
			break;
		case integer:
			cout<<"整型:"<<i<<endl;
			break;
		case floating_point:
			cout<<"浮点型:"<<f<<endl;
			break; 
	}	//利用swith对应三种类型
}//打印函数在类外部的实现
int main()
{
	DataType  A('c'),B(10),C(1.02F);//创建三个对象
	A.print();//对应switch中的char类型
	B.print();//对应switch中的int类型
	C.print();	//对应switch中的float类型
	system("pause");
	return 0;
}//主函数调用

运行结果:

图片描述

题目5

问答题:什么叫做复制构造函数?复制构造函数何时被调用?

答:

复制构造函数:

是一种特殊的构造函数,其形参是本类的引用,其作用是使用一个已经存在的对象(由复制构造函数的参数指定),去初始化同类的一个新对象;

调用的时候:

1.当用类的一个对象去初始化该类的另一个对象时;

2.如果函数的形参是类的一个对象,调用函数时,进行形参和实参的结合时;

3.如果函数的返回值是类的对象,函数执行完成返回调用者时;

题目6

/*程序名:题目6.cpp
功能:定义一个复数类Complex,使得代码能够进行下面的工作:
Complex c1(3,5); //用复数3+5i初始化c1
Complex c2 = 4.5;      //用实数4.5初始化c2
c1.add(c2);            //将c1与c2相加,结果保存在c1中
c1.show();             //将c1输出(这时的结果应该是7.5+5i
日期:2021.11.7
*/
#include <iostream>
using namespace std;
class Complex
{
public:
	Complex(float r, float i = 0)
	{
		real_part = r;
		imaginary_part = i;
	}//构造函数 
	void add(Complex com)
	{
		real_part = real_part + com.real_part;
		imaginary_part = imaginary_part + com.imaginary_part;
	}//运算符重载完成复数加号
	void show()
	{
		cout << real_part << "+" << imaginary_part << "i" << endl;
	}//打印出结果"实部+虚部i"
private:
	float imaginary_part, real_part;//定义实部虚部且为浮点型
};//定义Complex类
int main()
{	
	Complex c1(3,5);    //用复数3+5i初始化c1
	Complex c2 = 4.5;    //用实数4.5初始化c2
	c1.add(c2);   //将c1与c2相加,结果保存在c1中
	c1.show(); //将c1输出(这时的结果应该是7.5+5i
	system("pause");
	return 0;
}

运行结果:

图片描述

题目7


/*
程序名:题目7.cpp
功能:设计内嵌点类对象的组合类——矩形类Rectangle
私有属性包含平面上矩形左下角的一个点Point px;和矩形的宽度、高度:int width,height;
公有成员函数包含求矩形面积的函数;
在主函数中测试这个组合类,创建对象并求其面积。 
【提示】 组合类的设计可参照书中例题;构造函数的实现须使用初始化参数列表的形式。
日期:2021.11.7
*/
#include<iostream>
using namespace std;
class Point
{
public:
	Point (int xx=0,int yy=0)
	{
		x=xx;
		y=yy;
	}//Point的构造函数
	int showX()
	{
		return x;
	}
	int showY()
	{
		return y;
	}
private:
	int x,y;//私有数据成员x,y
};//点类
class Rectangle
{
public:
	Rectangle(Point p1,int W,int H);//Rectangle的构造函数的声明
	void square(Rectangle a)
	{	
		cout << "点为:("<<a.px.showX()<<","<<a.px.showY()<<")"<<endl;
		cout << "宽为:"<<a.width<<endl;
		cout << "高为:"<<a.height<<endl;
		cout << "面积为:" << a.height * a.width << endl;
	}//面积函数计算矩形的面积
private:
	Point px;//Point 类的对象px
	int width,height;//私有数据成员width height
};
Rectangle::Rectangle(Point p1,int W,int H) : px(p1),width(W),height(H) {}//Rectangle的构造函数的实现,其中对px width height赋初值
int main()
{
	Point p(1, 2);//声明一个Point类对象p
	Rectangle b(p, 2, 3);//声明一个Rectangle类对象 b 
	b.square(b);//调用square函数输出计算的面积
	system("pause");
	return 0;
}

运行结果:

图片描述

四、实验小结

问题与解决办法:

1.调用函数突然报错 怎么找都找不到

解决:突然发现自己调用无参函数连()括号都忘掉了

2.函数声明有报错

解决:函数声明不需要{}但需要;(这部分忘记了)

3.定义类报错

解决:忘记中括号后面加;

4.用switch时候提示没有case或default

解决:case 和后面的数要分开 比如case 1 而不是case1

5.用string的时候报错

解决:加一个string的头文件

心得体会:

有时候并不需要看别人的代码才能做不会的题,只要给一种解题的思路,也可以进行下去。

做题目的时候经常有报错,结果发现自己忘了加一个(),编译器提示乱七八糟也看不懂,做题的时候应该保持平稳心态,错误总会找到的,有时候自己看不出来自己哪里错了,可以找同学帮忙看一下哪里错了,有时候其他人一看就看出你的错误了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我是一只大狸子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值