类与对象(一)

149 阅读3分钟

面向对象程序设计的基本特点

抽象

对于具体问题进行概括,抽出一类对象的公共性质并加以描述的过程。
分为:

  • 数据抽象: 描述对象的属性或者状态(数据)。
  • 行为抽象: 描述某类对象的共同行为与功能特征(函数)。

封装

将抽象得到的数据与行为进行结合,形成一个有机的整体,也就是将数据与操作数据的函数进行有机地结合,形成“类”。
将数据和代码封装为可重用的模块,通过外部接口进行访问,对于成员访问权限进行管理。

继承

在保持原有类特性的基础上,进行更具体的说明。是由一般到特殊的过程,摆脱重复分析、重复开发的过程。

类和对象

类的定义

其语法格式如下:

class 类名称
{
public:
    外部接口
protected:
    保护型成员
private:
    私有成员
};

以时钟为例:

class Clock{
public:
    void setTime(int newH,int newM,int newS);
    void showTime();
private:
    int hour = 0,minute = 0,second = 0;//进行初始化
};  

类成员的访问控制

对类成员的访问控制属性可以有以下三种:

  • 公有类型(public): 定义了类的外部接口。
  • 私有类型(private): 只能被本类的成员函数访问,来自类外部的任何访问都是非法的。如果私有成员紧接着类名称,则关键字private可以省略。
  • 保护类型(protected): 与私有成员性质相似,其差别在于继承过程中对产生的新类影响不同。

一般情况下,数据成员都声明为私有类型,降低相互影响。
书写时将公有类型放在前面便于外部访问设计者阅读。

对象

声明格式: 类名 对象名;

//eg:
Clock myClock;

对象所占内存空间只是用于存放数据成员,函数成员不在每个对象中存储副本,每个函数代码在内存中只占一份空间。

访问数据成员:对象名.数据成员名
调用函数成员:对象名.函数成员名(参数表)
eg:myClock.showTime()

类的成员函数

成员函数的实现

函数的原型声明要写在类体中,原型说明了函数的参数表和返回值类型。函数体实现写在类定义外。具体格式如下:
返回值类型 类名::函数成员名(参数表) {函数体}
以显示时间为例:

void Clock::showTime(){
    cout << hour << ":" << minute << ":" << second << endl;
}

成员函数调用中的目的对象

在调用成员函数时,需要使用“.”操作符说明目的对象,在成员函数调用当前类的成员函数时,不使用“.”操作符,此次操作针对的仍然是目的对象。

在类的成员函数中,既可以访问目的对象的私有成员,又可以访问当前类的其他对象的私有成员。

带默认形参值的成员函数

public:
void setTime(int newH = 0,int newM = 0,int newS = 0);

内联成员函数

如果有成员函数需要频繁调用且代码简单,可以采用内联的形式提高执行效率。

隐式声明

class Clock{
public:
    void setTime(int nweH,int newM,int newS);
    void showTime(){
        cout << hour << ":" << minute << ":" << second << endl;
    }
};

显式声明

inline void Clock::showTime(){
    cout << hour << ":" << minute << ":" << second << endl;
}

程序实例

#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;  
}  
void Clock::showTime() {  
    cout << hour << ":" << minute << ":" << second << endl;  
}  
  
int main() {  
    Clock myClock;  
    cout << "First time set and output:" << endl;  
    myClock.setTime();  
    myClock.showTime();  
    cout << "Second time set and output:" << endl;  
    myClock.setTime(8,30,30);  
    myClock.showTime();  
    return 0;  
}