上机目的:
①.理解类和对象的概念,掌握声明类和定义对象的方法。
②.掌握构造函数和析构函数的实现方法。
③.初步掌握使用类和对象编制C++程序
基本任务:
创建一个类,完成以下功能:
①.连续输入一组二位坐标值;
②.二维坐标值的数目可以由用户自定义(默认为2个,最多为100个);
③.显示用户输入的坐标值;
④.显示用户输入坐标值的均值;
程序代码:
.h 文件:
#include<iostream>
using namespace std;
.cpp文件:
#include "homework3.h"
class Coordinate {
public:
Coordinate()
{
times = 2; //设置默认输入坐标数目
cout << "构造函数1被调用。" << endl;
}
Coordinate(int times1)
{
times = times1;
cout << "构造函数2被调用,坐标数为:" << times << endl;
}
~Coordinate()
{
cout << "析构函数被调用" << endl;
}
void InputCoord()
{
int i;
for (i = 0; i < times; i++)
{
cout << "请输入第" << i + 1 << "个坐标的横坐标:" << endl;
cin >> Coord[i][0];
}
for (i = 0; i < times; i++)
{
cout << "请输入第" << i + 1 << "个坐标的纵坐标:" << endl;
cin >> Coord[i][1];
}
}
void ShowCoord()
{
int i;
for (i = 0; i < times; i++)
{
cout << "第" << i + 1 << "个坐标为" << Coord[i][0] << ',' << Coord[i][1] << endl;
}
}
void ShowAvgCoord()
{
int i;
float avgx, avgy, sumx = 0, sumy = 0;
for (i = 0; i < times; i++)
{
sumx = sumx + Coord[i][0];
sumy = sumy + Coord[i][1];
}
avgx = sumx / times;
avgy = sumy / times;
cout << "横坐标平均值为:" << avgx << endl;
cout << "纵坐标平均值为:" << avgy << endl;
}
private:
float Coord[100][100];
int times;
};
int main()
{
int num;
cout << "是否需要改变输入坐标数目(默认值为2,最多可以为100个)?需要改变请按1,无需改变请按0:";
cin >> num;
if (num == 1)
{
int coordinate_numebr;
cout << "请输入要更改的坐标数目:" ;
cin >> coordinate_numebr;
Coordinate x(coordinate_numebr);
x.InputCoord();
x.ShowCoord();
x.ShowAvgCoord();
return 0;
}
if (num == 0)
{
Coordinate x;
x.InputCoord();
x.ShowCoord();
x.ShowAvgCoord();
return 0;
}
}
Debug过程中遇到的问题及解决方法:
1. 在Debug过程中,想要在main函数中通过输入坐标数目num来产生分支,定义定义对象时调用不同的构建函数来确定是默认的2还是其他的坐标数,但编译后报错,“x”未声明标识符,查了相关资料仍然没有解决这个问题。
2.相同的代码,第一天调试时没有这三个警告,但是第二天调试的时候出现了这三个警告,这三个警告原因如下:前两个是因为没有初始化数组,第三个是因为数组创建的太大了。但是相同的代码只是因为天数不同而产生了不同的结果,这是为什么呢?
程序运行结果:
使用默认值时:
用户自己设置输入坐标值时(以8为例):
实验总结 :
本次实验掌握了构造函数的实现方法,掌握了类中的三种限定符 public,private,protected,private、protected类的成员不能从类外直接访问,只能被本类中的其他成员函数调用;public类的成员既可以被本类的成员函数调用也可以在类外被该类的对象访问。本程序中Coordinate函数为public型,所以可以在类外访问。参考文章:类与对象的概念
类的声明是由结构体的声明发展而来的,结构体中只包含数据,不包含操作,而类中既有数据又有操作,并且一般不把类中的全部成员与外界隔离,一般是把数据隐蔽起来,而把成员函数作为对外界的接口。
声明一个类的方法为:
class Car //以class开头,表示声明一个类,名为Car
{
float weight;
char name[20];
int price;//以上3行是数据成员,类中的成员默认情况下为私有的
public:
void display( ) //成员函数
{
cout<<″car_weight:″<<weight<<endl;
cout<<″car_name:″<<name<<endl;
cout<<″car_price:″<<price<<endl; //以上4行是函数中的操作
}
};
Car car1,car2;//定义了两个Car类的对象car1和car2
定义对象有三种方法:
1.先声明类类型,然后再定义对象:上面的例子就是这种方法。
2.在声明类类型的同时定义对象:
class Car //以class开头,表示声明一个类,名为Car
{
float weight;
char name[20];
int price;//以上3行是数据成员,类中的成员默认情况下为私有的
public:
void display( ) //成员函数
{
cout<<″car_weight:″<<weight<<endl;
cout<<″car_name:″<<name<<endl;
cout<<″car_price:″<<price<<endl; //以上4行是函数中的操作
}
} car1,car2;
3.不出现类名,直接定义对象:
class //以class开头,表示声明一个类
{
float weight;
char name[20];
int price;//以上3行是数据成员,类中的成员默认情况下为私有的
public:
void display( ) //成员函数
{
cout<<″car_weight:″<<weight<<endl;
cout<<″car_name:″<<name<<endl;
cout<<″car_price:″<<price<<endl; //以上4行是函数中的操作
}
} car1,car2;
该程序定义了两个无类名的类对象 直接定义对象,在C++中是合法的、允许的,但却很少用,也不提倡用, 一般情况第一种方式用的比较多。参考文章:C++类的声明和对象的定义
心得体会:本次实验在完成基本任务的基础上增加了用户可以自行输入坐标的数目,但是编程中出现的问题也成功解决,但是出现问题的原因还不是很清楚,而且为什么不同时间程序编译有时没有警告有时有警告,这种情况的原因也不是很清楚,问题都解决了,但是出现问题的原因不是特别明确。