面向对象程序设计的基本特点
抽象
对于具体问题进行概括,抽出一类对象的公共性质并加以描述的过程。
分为:
- 数据抽象: 描述对象的属性或者状态(数据)。
- 行为抽象: 描述某类对象的共同行为与功能特征(函数)。
封装
将抽象得到的数据与行为进行结合,形成一个有机的整体,也就是将数据与操作数据的函数进行有机地结合,形成“类”。
将数据和代码封装为可重用的模块,通过外部接口进行访问,对于成员访问权限进行管理。
继承
在保持原有类特性的基础上,进行更具体的说明。是由一般到特殊的过程,摆脱重复分析、重复开发的过程。
类和对象
类的定义
其语法格式如下:
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;
}