类的定义与对象的创建
1.实验目的
(1)理解并学会使用类,并创造合适的对象
(2)掌握在什么场景下需要使用 类
2.实验内容
类的定义、类成员的访问控制、对象、类的成员函数
3.实验过程
3.1类和对象
Part1.应用场景
类是面向对象程序设计方法的核心,利用类可以实现对数据的封装和隐蔽。
在面向对象程序设计中,程序模块是由类构成的。类是对逻辑上相关的函数与数据的封装,它是对问题的抽象描述。
Part2.定义及代码
3.1.1类的定义
class 类名称 { public: 外部接口 protected: 保护型成员 private: 私有成员 };
其中,public、protected、private分别表示对成员的不同访问控制权限。
注意:在类中可以只声明函数的原型,函数的实现(即函数体)可以在类外定义。
例:
时钟类
class Clock{ public : void setTime(int newH,int newM,int newS); void showTime(); private: int hour,minute,second; };
这里封装了时钟的数据和行为,分别称为Clock类的数据成员和函数成员。
3.1.2类成员的访问控制
类的成员包括:数据成员、函数成员。分别描述问题的属性和行为,是不可分割的两个方面。
访问控制属性(3种):公有类型 public,私有类型 private,保护类型 protected。
特点:①公有类型:公有类型成员定义了类的外部接口在类外只能访问类的公有成员;
②私有类型:后面声明的是私有成员,如果私有成员紧接着类的名称,则关键字private可以省略。
私有成员只能被本类的成员函数访问,来自类外部的任何访问都是非法的。保护了数据的安全性。
(一个类的数据成员都应该声明为私有成员,使模块之间的相互作用被降低到最小)
③保护类型:保护类型成员和私有成员的性质相似,其差别在于继承过程中对产生的新类影响不同。
注意:具有不同访问属性的成员可以按任意顺序出现,修饰访问属性的关键字也可以多次出现,但是一个成员只能有一种访问属性。
3.1.3对象
类的对象就是该类的某一特定实体(也称实例)。
声明方式:
类名 对象名;
例如:
Clock myClock;
访问数据成员的一般形式:
对象名.数据成员名;//用“.”
调用函数成员的一般形式:
对象名.函数成员名(参数表);//使用“.”
例:
myClock.showTime();
注意:在类的外部只能访问到类的公有成员;在类的成员函数中,可以访问到类的全部成员。
3.1.4类的成员函数
类的成员函数描述的是类的行为,例如时钟类的成员函数setTime()和showTime()。成员函数是程序算法的实现部分,是对封装的数据进行操作的方法。
①成员函数的实现
函数原型的声明要写在类体中,原型说明了函数的参数表和返回值类型。而函数的具体实现是写在类定义之外的。
与普通函数不同,实现成员函数时要指明类的名称。
具体形式:
返回值类型 类名::函数成员名(参数表){ 函数体 }
例如:
void Clock::setTime(int newH,int newM,int newS){ hour=newH; minute=newM; second=newS; } void Clock::showTime(){ cout<<hour<<":"<<minute<<":"<<second<<endl; }
可以看出与普通函数不同,类的成员函数名需要用类名来限制,例如 Clock::showTime()。
②成员函数调用中的目的对象
调用一个成员函数和一个普通函数的差异在于,需要使用“.”的操作符指出调用所针对的对象,这一对象在本次调用中称为目的对象。
在成员函数中可以不使用“.”的操作符而直接引用目的对象的数据成员。
在成员函数中引用其他对象的属性和调用其他对象的方法时,都需要使用“.”。
③带默认形参值的成员函数
类的成员函数可以有默认参数值,其调用规则与普通函数相同。
类成员函数的默认值,一定要写在类定义中,而不能写在类定义之外的函数实现中。
例:
class Clock{ public: void setTime(int newH=0,int newM=0,int newS=0); ...... };
如果调用这个函数时没有实参,就会按照默认值将时钟设置到默认零点。
3.1.5内联成员函数
如果有的成员函数需要被频繁调用,而且代码比较简单,这个函数也可以定义为内联函数。
声明方式:
隐式声明和显式声明
隐式声明:将函数体直接放在类体内
class Clock{ public: void setTime(int newH,int newM;int newS); void showTime(){ cout<<hour<<":"<<minute<<":"<<second<<endl; } private: int hour,minute,second; };
显式声明:采用关键字inline
inline void Clock::showTime(){ cout<<hour<<":"<<minute<<":"<<second<<endl; }
效果和前面的隐式表达完全相同。
3.1.6程序实例
#include<iostream> using namespace std; class Clock { public: void setTime(int newH = 0, int newM = 0, int newS = 0); void showTime(); private: int hour, minute, second; }; void Clock::setTime(int newH, int newM, int newS) { hour = newH; minute = newM; second = newS; } inline void Clock::showTime() { cout << hour << ":" << minute << ":" << second << endl; } int main() { Clock myClock; cout << "First time set and output:" << endl; myClock.setTime(); myClock.showTime(); cout << "Secong time set and output:" << endl; myClock.setTime(8, 30, 30); myClock.showTime(); return 0; }
分析:
本程序可分为三个独立的部分,第一部分是类的Clock定义,第二部分是时钟类成员函数的具体实现,第三部分是主函数main()。
这里的成员函数setTime是带有默认参数值的函数,有三个默认参数。showTime是显式声明的内联成员函数。
主函数中声明了一个类的对象myClock,然后用这个对象调用其成员函数。