C++第三次上机实验总结(掌握声明类和定义对象的方法)

上机目的:

①.理解类和对象的概念,掌握声明类和定义对象的方法。

②.掌握构造函数和析构函数的实现方法。

③.初步掌握使用类和对象编制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++类的声明和对象的定义

       心得体会:本次实验在完成基本任务的基础上增加了用户可以自行输入坐标的数目,但是编程中出现的问题也成功解决,但是出现问题的原因还不是很清楚,而且为什么不同时间程序编译有时没有警告有时有警告,这种情况的原因也不是很清楚,问题都解决了,但是出现问题的原因不是特别明确。

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
C++上机实验报告-实验五全文共7页,当前为第1页。C++上机实验报告-实验五全文共7页,当前为第1页。实验五 继承与派生 C++上机实验报告-实验五全文共7页,当前为第1页。 C++上机实验报告-实验五全文共7页,当前为第1页。 实验目的 1.学习定义和使用的继承关系,定义派生 2.熟悉不同继承方式下对基成员的访问控制 3.学习利用虚基解决二义性问题 实验要求 1.定义一个基Animal,有私有整型成员变量age,构造其派生dog,在其成员函数SetAge(int n)中直接给age赋值,看看会有什么问题,把age改为公有成员变量,还会有问题吗?编程尝试。 2.定义一个基BaseClass,有整型变量Number,构造其派生DerivedClass,观察构造函数和析构函数的执行情况。 3.定义一个车(vehicle)基,具有Maxspeed、Weight等成员,Run、Stop等成员函数,由此派生出自行车(bicycle)、汽车(motorcar)。自行车(bicycle)有高度(Height)等属性,汽车(motorcar)有座位数(SeatNun)等属性。从bicycle和motorcar派生出摩托车(motorbicycle),在继承过程中,注意把vehicle设置为虚基。如果不把vehicle设置为虚基,会有什么问题?编程尝试。 实验内容及实验步骤 1.编写程序定义Animal,成员变量age定义为私有的。构造派生dog,在其成员函数SetAge(int n)中直接对age赋值时,会出现似以下的错误提示: error C2248 : 'age' : cannot access private member declared in class 'Animal' error C2248 : 'age' : cannot access private member declared in class 'Animal' 把age改为公有成员变量后重新编译就可以了。程序名:lab7_1.cpp。 2.编写程序定义一个基BaseClass,构造其派生DerivedClass,在构造函数和析构函数中用cout输出提示信息,观察构造函数和析构函数的执行情况。程序名:lab7_2.cpp。 3.用debug功能跟踪程序lab7_2的执行过程,观察基和派生的构造函数和析构函数的执行情况。 4.编写程序定义一个车(vehicle)基,由此派生出自行车(bicycle)、汽车(motorcar),注意把vehicle派生为虚基。再从bicycle和motorcar派生出摩托车(motorcycle),在main()函数中测试这个。程序名:lab7_3.cpp。 编译成功后,把vehicle设置为非虚基,再编译一次,此时系统报错,无法编译成功。这是因为若不把vehicle设置为虚基,会出现二义性错误,程序不能成功编译。 思考题 1.如何在已有的的基础上设计新的? 采用的派生的方法,利用基派生出子,子继承基的属性,从而在已有基的基础上设计新的派生,模式如下: class 派生名:继承方式 基名1,继承方式 基名2,…,继承方式 基名n { 派生成员声明; }; 2.基和派生对象的构造顺序是怎样的? 先调用基的构造函数,然后再调用内嵌对象(派生中的对象)的构造函数。基构造函数的调用顺序是按照派生定义时的顺序,而内嵌对象的构造函数调用顺序是按照成员在C++上机实验报告-实验五全文共7页,当前为第2页。C++上机实验报告-实验五全文共7页,当前为第2页。中声明的顺序。 C++上机实验报告-实验五全文共7页,当前为第2页。 C++上机实验报告-实验五全文共7页,当前为第2页。 3.如何利用虚基解决二义性问题? 将共同基设置为虚基,语法为: class 派生名:virtual 继承方式 基名 源程序 Lab7_1.cpp #include<iostream> using namespace std; class Animal//Animal { /*private: int age;*/ public: int age; Animal(){} ~Animal(){} Animal(int ); }; class Dog:public Animal//Dog,Animal的公有派生 { private: int number; public: Dog(){} ~Dog(){} Dog(int,int); void setAge(int ); void showNumber(); void showAge(); }; Animal::A
为了方便,把代码放在Word里面了,每次上机实验的题目代码都在。 第一次: 对如下多项式编写定义: + + +…+ 其中,n为多项式的次数。完成如下功能: (1) 可存储任意大的多项式(提示:可用动态数组实现)。 (2) 定义构造函数、析构函数、拷贝构造函数。 (3) 包含一个static成员存储定义的多项式的数量。 (4) 定义一个成员函数输出多项式。(可参照-x^4-6x^3+5格式输出) (5) 定义一个成员函数计算多项式的值。 (6) 写main函数测试的功能。 (7) 采用多文件实现。 考虑:哪些成员函数可以声明为const. 第二次: (8) 重载“+”运算符,实现两个多项式相加。 (9) 重载“-”运算符,实现两个多项式相减。 (10) 重载“*”运算符,实现两个多项式相乘。 (11) 重载“=”运算符,实现两个多项式的赋值运算。 考虑:把其中某个运算符重载为友元函数。 第三次C++的一般编译器都定义和封装了字符串功能,请模仿定义string的实现,可以实现并支持如下功能: (1)string s = “吉林大学”; (2)string t = s; (3)string m; m = t; (4)m.legnth() 函数测量字符串的长度 (5)m.cat(string const &)连接字符串 第四次: 我公司为仪器生产企业,目前生产摄像机和行车记录仪两种产品,分别销售给用户。 摄像机包含摄像、图像质量设定、编码算法等属性。 将摄像机增加相应芯片(具有操作菜单、自动拍摄、车速传感器、源代码等功能)后,形成一个行车记录仪。 要求: 设计摄像机,并请根据下列不同的功能要求,采用不同的继承方式,设计行车记录仪,并添加测试代码,体验不同继承方式下的成员访问属性。(设计时可根据需要自行添加数据成员和其他成员函数。) (1) 行车记录仪的芯片可以使用摄像机的摄像、图像质量设定功能。 行车记录仪用户可以操作行车记录仪的操作菜单和摄像机的摄像功能。 (2)行车记录仪的芯片可以使用摄像机的拍摄、图像质量设定功能。 行车记录仪用户仅仅可以操作行车记录仪的操作菜单。 (3) 行车记录仪的芯片可以使用摄像机的拍摄、图像质量设定功能。 行车记录仪用户仅仅可以操作行车记录仪的操作菜单 同时其他公司购买行车记录仪,因该公司也用于销售,不得泄露其全部内容 课后: (1)采用组合方式设计行车记录仪,增加相应测试代码,体验继承和组合的关系。 (2)分别为继承和组合方式下为各添加构造函数、析构函数,增加相应测试代码,体验对象的初始化和构造顺序。 (3)将摄像机和行车记录仪功能相近的函数(如拍摄、编码等功能函数)设为同名函数,增加相应测试代码,体验同名函数覆盖。 (4)为我公司建立一个多态的产品层次结构,使用抽象,测试时,创建一个基指针的容器,通过基指针调用虚函数,体验多态。
有关对象的程序算法设计:1.试分析以下程序的运行结果并上机验证. #include<iostream.h> class Sample {    int x; public:    Sample(){}    Sample(int a){x=a;}    Sample(Sample &a){x=a.x+++10;}    void disp(char *ob)    { cout<<ob<<"x="<<endl;}    };    void main()    {     Sample s1(2),s2(s1),s3;     s3=s2;     s1.disp("s1.");     s2.disp("s2.");     s3.disp("s3.");    }    运行结果为:                                                          2.以下是一个中包含另一个对象成员(的组合)的例子,试分析并给出程序的运行结果. #include<iostream.h> class Son {  int age; public: Son(){ age=1;} Son(int i){age=i;} void print(){ cout<<"儿子的年龄是:"<<age<<endl;} }; class Father {   int age;   Son s1,s2; public:    Father(int a1,int a2,int f):s2(a2),s1(a1)    { age=f;}    void print()    {    cout<<"父亲的年龄是:"<<age<<endl; }    Son&gets1(){cout<<"第一个";return s1;}    Son&gets2(){cout<<"第二个";return s2;}    };    Void main()    {    Father f(10,5,38);    f.print();    f.gets1().print();    f.gets2().print();     }    运行结果为:                                                      3.定义一个score,它含有私有数据成员english_score(英语分数)、公有成员函数printscore(),其中printscore()用来输出english_score的值。在主程序中定义score的两个对象stu1和stu2,其英语成绩分别为85.5和98.5,输出这两个分数。用构造函数来初始化私有成员。 【实验步骤】 第3题的实验步骤如下: 根据题目要首先定义一个score。 使用debug调试功能观察以下参考程序的运行流程,跟踪观察的构造的构造函数析构函数、成员函数的执行顺序。 #include<iostream.h>   class score{   float english_score;   public:   score(float t){english_score=t;} void printscore(){cout<<”english_score=”<<english_score;}    }; void main() { score stu1(85.5),stu2(98.5);    stu1.printscore();    stu2.printscore();} 调试操作步骤如下: 单击Build|Start Debug|Step Into命令,或按下快捷键F11,系统进入单步执行状态,程序开始运行,一个DOS窗口出现,此时Visual Studio中光标停在main()函数的入口处; 从Debug菜单或Debug工具栏中单击Step Over,此时,光标下移,程序准备执行score对象的初始化; 单击Step Into,程序准备执行score的构造函数; 连续单击Step Over,观察构造函数的执行情况,直到执行完构造函数,程序回到主函数; 此时程序准备执行stu1对象的printscore()函数,单击Step Into,程序进入printscore()成员函数,连续单击Step Over,直到回到main()函数; 连续执行程序,参照上述方法,观察程序的执行顺序,加深对的构造函数、析构函数、成员函数的执行顺序的认识; 在试试Debug菜单栏中别的菜单中别的菜单项,熟悉Debug各种方法。 【实验仪器与软件平台】 计算机 Windows2000 Visual C++6.0 【实验预备知识】 计算机文化基础 【实验结果】 1.程序: #include<iostream.h> class Sample { int x; public: Sample(){} Sample(int a){x=a;} Sample(Sample &a){x=a.x+++10;} void disp(char *ob) { cout<<ob<<"x="<<endl;} }; void main() { Sample s1(2),s2(s1),s3; s3=s2; s1.disp("s1."); s2.disp("s2."); s3.disp("s3."); } 运行结果: } 2.程序: #include<iostream.h> class Son { int age; public: Son(){ age=1;} Son(int i){age=i;} void print(){ cout<<"儿子的年龄是:"<<age<<endl;} }; class Father { int age; Son s1,s2; public: Father(int a1,int a2,int f):s2(a2),s1(a1) { age=f;} void print() { cout<<"父亲的年龄是:"<<age<<endl; } Son&gets1(){cout<<"第一个";return s1;} Son&gets2(){cout<<"第二个";return s2;} }; void main() { Father f(10,5,38); f.print(); f.gets1().print(); f.gets2().print(); } 运行结果: 程序: #include<iostream.h> class score{ float english_score; public: score(float t){english_score=t;} void printscore(){cout<<"english_score="<<english_score;} }; void main() { score stu1(85.5),stu2(98.5); stu1.printscore(); stu2.printscore();} 运行结果: 【实验总结】通过本次实验基本掌握声明方法掌握成员函数的定义形式. 深刻理解对象的概念,掌握对象定义和使用方法,学会了构造函数和析构函数的作用及其使用方法以及的组合.
C++上机实验报告-实验六全文共11页,当前为第1页。C++上机实验报告-实验六全文共11页,当前为第1页。实验六 多态性 C++上机实验报告-实验六全文共11页,当前为第1页。 C++上机实验报告-实验六全文共11页,当前为第1页。 实验目的 1.掌握运算符重载的方法 2.学习使用虚函数实现动态多态性 实验要求 1.定义Point,有坐标_x,_y两个成员变量;对Point重载"++"(自增)、"――"(自减)运算符,实现对坐标值的改变。 2.定义一个车(vehiele)基,有Run、Stop等成员函数,由此派生出自行车(bicycle)、汽车(motorcar),从bicycle和motorcar派生出摩托车(motorcycle),它们都有Run、Stop等成员函数。观察虚函数的作用。 3. (选做)对实验4中的People重载"=="运算符和"="运算符,"=="运算符判断两个people对象的id属性是否相等;"="运算符实现People对象的赋值操作。 实验内容及实验步骤 1.编写程序定义Point,在定义整型的私有成员变量_x_y,定义成员函数Point& operator++();Point operator++(int);以实现对Point重载"++"(自增)运算符,定义成员函数Point& operator--();Point operator--(int);以实现对Point重载"--"(自减)运算符,实现对坐标值的改变。程序名:1ab8_1.cpp。 2.编写程序定义一个车(vehicle)基,有Run、Stop等成员函数,由此派生出自行车(bicycle)、汽车(motorcar),从bicycle和motorcar派生出摩托车(motorcycle),它们都有Run、Stop等成员函数。在main()函数中定义vehicle、bicycle、motorcar、motorcycle的对象,调用其Run()、Stop()函数,观察其执行情况。再分别用vehicle型的指针来调用这几个对象的成员函数,看看能否成功;把Run、Stop定义为虚函数,再试试看。程序名:lab8_2.cpp。 思考题 如何将一个运算符重载为的成员函数? 函数型 operator 运算符(形参表) { 函数体; } 如何将一个运算符重载为的友元函数? friend 函数型 operator 运算符(形参表) { 函数体; } 3.如何实现运行时刻的多态? 在基的成员函数前加上virtual,就可以在它的派生声明相同名字和型的成员函数,在运行过程中,系统会自动判断并调用相应中的成员函数,从而在调用过程中实现多态。 源程序 lab8_1.cpp #include<iostream> C++上机实验报告-实验六全文共11页,当前为第2页。C++上机实验报告-实验六全文共11页,当前为第2页。using namespace std; C++上机实验报告-实验六全文共11页,当前为第2页。 C++上机实验报告-实验六全文共11页,当前为第2页。 class Point { private: int _x; int _y; public: //构造.析构函数 Point(){} Point(int,int); ~Point(){} //++.--重载 Point& operator ++(); Point operator ++(int); Point& operator --(); Point operator --(int); //输出点坐标 void showPoint(); }; Point::Point(int x,int y) { _x=x; _y=y; } Point& Point::operator ++() { _x++; _y++; return *this; } Point Point::operator ++(int) { Point p=*this; ++(*this); return p; } Point& Point::operator --() { _x--; _y--; return *this; } Point Point::operator --(int) { C++上机实验报告-实验六全文共11页,当前为第3页。C++上机实验报告-实验六全文共11页,当前为第3页。 Point p=*this; C++上机实验报告-实验六全文共11页,当前为第3页。 C++上机实验报告-实验六全文共11页,当前为第3页。 --(*this); return p; } void Point::showPoint() { cout<<"The point is ("

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值