资源描述
实验一 类与对象㈠——类与对象的定义
一、实验目的
1.熟悉类的构成,掌握类的定义方法;
2.掌握对象的定义及对象成员的访问方法;
3.初步熟悉类与对象简单应用及编程。
二、实验学时
课内实验:2课时 课外练习:2课时
三 本实验涉及的新知识
㈠ 结构与类
1.C++的结构
C++中的结构是在C语言结构体的基础上扩展得到的。即在C++的结构体中,除可以定义数据成员外,还可以在定义函数,称为成员函数。
⑴ C++结构体的成员分为数据成员及成员函数;
⑵ C++结构的成员(数据成员或成员函数)可以定义为公有成员(public)、私有成员(private)、保护成员(protected),其缺省定义为公有成员。
2.C++的类
C++提供了一种新的比结构体更为安全的数据类型,即“类”类型。类与结构体最为本质的区别是,成员的缺省定义为私有成员,体现了数据的封装与隐藏性。
⑴ 同结构一样,在C++中,“类”是由用户自定义的一种数据类型;
⑵ C++的类中包括数据成员及成员函数,即将数据(数据成员)及对数据的操作(成员函数)封装在一个类中。
㈡ 类的定义
class 类名
{ [private :]
私有数据成员或成员函数
public :
公有数据成员或成员函数
protected
保护数据成员或成员函数
} ;
1.定义格式
2.说明:
⑴ 类的定义(或称类的声明)中,private、protected、public可以按任意顺序出现任意次。
⑵ 成员的访问限制
① 公有成员(public):所定义的成员是开放的,可在任何地方访问(类内部及程序的其他地方);
② 私有成员(private):所定义的成员是隐藏的,只能在类内部访问,不能在程序的其他地方访问;
③ 保护成员(protected):所定义的成员是半开放的,可在类内部访问,也可在其派生类中访问,但不能在程序的其他部分访问。
在类体外可以通过调用类的公有成员使用私有数据成员或保护数据成员,但不能改变其值。
⑶ 数据成员通常定义为私有成员,以实现数据的隐藏;成员函数通常定义为公有成员,以通过消息传递访问数据成员;保护成员主要用于继承。
3.数据成员
⑴ 定义格式:
类型 数据成员名;
⑵ 说明:
① 在定义类的数据成员时,由于计算机不给数据成员分配内存空间,不能使用auto、register、extern等进行说明,也不能赋初值;
② 数据成员既可为基本数据类型,也可以是复杂数据类型(数组、指针、引用、结构体变量、类的对象等)。
4.成员函数
在面向对象程序设计中,成员函数也称方法,是面向对象程序设计消息传递机制的实现方式。
⑴ 定义格式
① 在类中定义:
返回类型 函数名(形参表)
{ 函数体}
② 在类外定义:
在类中只给出成员函数的原型,成员函数体在类的外部定义。
类体内定义格式:
返回类型 (函数名(形参表);
类体外定义格式:
返回类型 类名::函数名(形参表)
{ 函数体}
⑵ 说明:
① 通常,当成员函数代码量较大时,在类外定义成员函数;
② 在定义成员函数以前一定要加上类名,类名与函数名间一定要用“::”,以表示与普通函数的区别;
③ 成员函数中,应给出形参,当无形参时,通常应加上void;
④ 成员函数的返回值类型,与函数原型中的返回类型必须相同;
⑤ 成员函数与普通函数一样,可以设置参数的默认值;
⑥ 在类内部定义的成员函数为内置函数,如果要将类外部定义的成员函数设置为内联函数,则应在函数定义前加上inline。
㈢ 对象的定义及成员的引用
类和对象是面向对象程序设计最重要的两个概念。从程序设计的角度理解,类是将具有相同数据成员、成员函数的操作对象的概括(或抽象),是定义对象的模板;而对象是类的实例化或具体化,即“类”变量。
1.对象的定义
⑴ 格式:
类名 对象名表;
⑵ 说明:在定义类时,计算机并不给类分配存储空间,只有定义了对象后,计算机才为对象分配存储空间。
2.对象成员的使用
⑴ 数据成员的使用
格式:
对象名.数据成员名
(只能是公有数据成员)。
⑵ 成员函数的使用
格式:
对象名.成员函数名(实参表)
对象名.类名::成员函数名(实参表)
⑶ 说明:
① 私有成员、公有成员不能在类的外部被使用,如果数据成员定义为私有成员、保护成员,则只能通过公有成员函数使用;
② 可以定义指向对象的指针用操作符“->”访问对象成员,也可以定义对象的引用,使用方法请参考实验二相关内容。
4.对象的赋值
可以用赋值方式将一个对象赋值给另一个对象,也称为对象的拷贝。
⑴ 格式:
对象名1=对象名2;
⑵ 说明:
① 在使用对象赋值语句时,两个对象必须是相同的类;
② 对象赋值后,二个对象仍是分离的,当改变某一对象成员的值时,另一对象不会因此而改变;
③ 对象赋值是一种浅拷贝(即位拷贝,对象有深拷贝将在以后的实验中介绍)。
四、实验内容
㈠ 验证及认知实验
按要求调试下列程序(exp_101.cpp),并回答相关问题。
#include <iostream.h>
#include <math.h>
class complex
{ private:
double real;
double imag;
public:
void set_complex(double r,double i)
{ real=r;imag=i;}
double get_real( )
{return real;}
double get_imag( )
{return imag;}
double get_abs( )
{ double t;
t=sqrt(real*real+imag*imag);
return t;
}
};
void main()
{ complex A;
A.set_complex(3.0,4.0);
cout <<"real of complex A=";
cout <<A.get_real()<<endl;
cout <<"imag of complex A=";
cout <<A.get_imag()<<endl;
cout <<"abs of complex A= ";
cout <<A.get_abs()<<endl;
}
问题:
⑴ 程序的输出结果为:
⑵ 成员函数(方法)set_complex(double r,double i)的作用是 ;
get_real( ) 的作用是 ;get_imag( ) 的作用是 ;
get_abs( ) 的作用是 。
⑶ 将main()函数中的语句行“ cout <<A.get_real()<<endl ;”改为“cout <<A. real<<endl;”,重新编译程序,将出现 其原因是 。
㈡ 知识应用实验
1.分析下列程序,写出程序的输出结果,再上机运行程序验证其正确性,如果不正确,请认真分析出错原因。
程序2(exp_102.cpp)
#include<iostream.h>
你分析的程序输出结果是:
class point
{ private:
float x,y;
public:
void set_point(float a,float b);
float read_x(void);
float read_y(void);
void move(float a,float b);
程序的实际输出结果是:
};
void point::set_point(float a,float b)
{x=a ; y=b; }
float point::read_x(void)
{ return x;}
float point::read_y(void)
{ return y;}
void point::move (float a,float b)
{ x+=a;y+=b;}
void main(void)
{ point p1,&p2=p1;
p1.set_point(20,30);
cout<<"x="<<p1.read_x();
cout<<" y="<<p1.read_y()<<endl;
cout<<"x="<<p2.read_x();
cout<<" y="<<p2.read_y()<<endl;
p2.move(5,5);
cout<<"x="<<p1.read_x();
cout<<" y="<<p1.read_y()<<endl;
}
2.按要求完善并调试通过下列程序
程序3
⑴ 完善“hdate.h”中类的定义:
class Date
{ private:
int year,month,day;
public:
void set_date(int y=2000,int m=1,int d=1) //对数据成员赋值
{ }
int get_year() //返回year
{ }
int get_month() //返回month
{ }
int get_day() //返回day
{ }
int isleapyear(void); //是闰年返回1,不是闰年返回0
void print_date(void)
{cout<<year<<'-'<<month<<'-'<<day<<endl;}
};
int Date::isleapyear(void) //是闰年返回1,不是闰年返回0
{
}
⑵ 按注释要求完善下列程序(exp_103.cpp)
#include<iostream.h>
#include"hdate.h"
void main(void)
{ Date da1,da2;
int y,m,d;
da1.set_date(2004,5,1);
da1.print_date();
cout<<"year=";cin>>y;
cout<<"month=";cin>>m;
cout<<"day=";cin>>d;
//调用方法set_date(),用消息y,m,d对da2的数据成员赋值
//调用方法输出将da2用“ 年 月 日”格式输出年月日
//调用方法输出da2的年是否为闰年
}
㈢ 程序设计实验
说明:请将所设计的程序以给定的文件名存放在自己的文件夹下(后同)。
1.定义一个time类保存在“htime.h”中,要求:
⑴ 数据成员包含时(hour)、分(minute)、秒(second),为私有成员;
⑵ 能给数据成员提供值的成员函数(默认值为0时0分0秒);
⑶ 能分别取时、分、秒;
⑷ 能输出时、分、秒(用“:”分隔),并显示上午(am)或下午(pm);
⑸ 有默认值的构造函数(默认值为0时0分0秒)。
说明:成员函数均定义为公有成员。
2.编写一个测试time类的main()函数(存放在exp_104.cpp)中。要求:
⑴ 定义对象、对象指针、对象的引用;
⑵ 用输入的值设置时间;
⑶ 用输出时、分、秒的成员函数显示时间;
⑷ 用取时、分、秒的成员函数以“ 时 分 秒”的格式显示时间;
⑸ 分别用对象、对象指针、对象的引用调用成员函数。
四、实验收获与创新
1.通过完成本实验,谈谈你对面向对象程序设计的初步认识。
2.自已拟定一个解决实际简单题目,分析并抽象为一个类,然后定义对象测试(类的定义放在头文件中,测试程序用exp_105.cpp保存)
6
展开阅读全文