C++程序设计基础实验-实验三 类和对象

一、 实验目的

掌握类的定义及实例化

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

掌握类的成员访问控制

二、实验内容

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

三、实验步骤及结果

  1. 设计点类 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;
};

运行结果:
在这里插入图片描述

  1. 设计一个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;
}

运行结果:
在这里插入图片描述

  1. 定义一个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;
}

运行结果:
在这里插入图片描述

  1. 定义一个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;
}

运行结果:
在这里插入图片描述

  1. 问答题:什么叫做复制构造函数?复制构造函数何时被调用?
复制构造函数是只有单个形参, 且形参是对本类类型对象的引用的构造函数。

有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;
}

运行结果:
在这里插入图片描述

  1. 设计内嵌点类对象的组合类——矩形类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;
}

运行结果:
在这里插入图片描述

四、实验小结

问题与解决办法:

  1. 编译出错 :[Error] ‘sqrt’ was not declared in this scope

    解决办法:运用sqrt函数需要头文件#include <math.h>。

  2. 编译出错,提示“[Error] expected before return”

    解决办法:语句结束时的英文下的分号“;”输成了中文下的分号。改正后,错误消失。

  3. 编译出错,提示“ [Error] expected ‘;’ before ‘)’ token”

    解决办法:for循环里的分号“;”写成了逗号“,”。改正后,错误消失。

心得体会:类好难,感谢老师与助教的细心讲解。

  • 12
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

子书棋

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

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

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

打赏作者

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

抵扣说明:

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

余额充值