类的定义与对象的创建.

早过忘川 提交于 2019-12-02 15:03:08

类的定义与对象的创建

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,然后用这个对象调用其成员函数。

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!