本篇博客是对学校课堂教学内容、PPT的整理。
目录
前言
C++相较于C,加了面向对象的部分~
学好面向对象的程序设计,就好像将问题又从抽象化为具体,对于简化代码、提高代码可读性有着无与伦比的好处,因此学好面向对象的程序设计非常重要。
课堂分两节半大课对面向对象部分进行讲解,内容分为两部分,此是第一部分。
一、面向对象程序设计概述
1. 程序设计语言
程序设计语言是用于描述计算机程序的语言,从硬件而上可大致分为分为机器语言、汇编语言、高级语言。
2. 程序设计方法
(1) 结构化结构程序设计方法
- 自顶向下、逐步求精、模块化(函数)。程序由一个个函数组成
- 结构定理:任何程序逻辑都可以用顺序、选择和循环三种结构表示
- 通常将问题不断拆分为各个子问题直到能求解
(2)面向对象程序设计方法
- 现实世界中的系统都由对象组成。将每一类对象的数据与操作封装成一个类。通过对象之间的相互协调来完成整个系统。程序由一个个类组成
- 程序的设计重点在数据,函数为数据服务
- 数据被隐藏起来,不能为外部程序直接访问
(3)面向对象方法
- 直接将问题求解映射到问题的认识上,将软件设计决策与客观世界的认识相匹配
- 提供了一种有目的地将系统分解为模块的策略
- 随着用户功能需求的增多,软件越来越庞大、复杂,面向对象方法越来越显示其优势,并逐渐成为主流
(4)面向对象的主要特征
用一个例子来说明面向过程和面向对象设计方法的不同:
【图书管理系统】
面向过程 | 面向对象 |
关注对书的操作:
•
输入数据
•
图书出库
•
图书入库
•
打印图书信息
•
增加、删除、修改图书信息
•
添加读者
•
借书
•
还书
•
……
| 关注该系统涉及的对象
•
图书
•
属性
•
图书编号
•
图书名
•
图书状态
•
方法
•
打印图书信息
•
更新图书状态
•
读者
•
属性
•
读者编号
•
姓名
•
借书记录
•
方法
•
借书
•
还书
•
打印读者信息
|
(5)面向对象编程
二、类的定义与实现
1.类的定义
先给出一个示例:
class Reader {
private:
long m_ID;
char m_name[30];
Book* m_brrBooks[10];
int m_brrBooksNum;
public:
Reader(int id, char name[]);
~Reader();
void ChangeName(char name[]);
void BorrowBook(Book* book);
void ReturnBook(Book* book);
void ShowBrrBooks();
};
注意:类的定义一般写在.h文件中
(1)访问控制
private 与 public (实际上还有protected )标识了对应区域数据的访问属性。
对于前两者,简单来说:
private: 下面数据是私有的,外面不可访问
public: 下面函数是公开的,外面可以访问
三个访问控制进一步说明:
- public:公开的,可被外部访问
- private:私有的,仅自己内部可访问
- protected:受保护的,自己和子类可访问
- 在用class定义的类中,默认的访问方式是private
- 在类的定义中,三个访问说明符都可以使用多次(不提倡)
(2)数据成员
- 可以定义各种类型的变量、指针、数组等,甚至是其他类的对象
- 不能在类的定义中给数据成员赋初值
- 数据成员一般放在private部分;也可以放在public部分,但不提倡
(3)成员函数
- 用来定义类的操作
- 可放在public部分,也可以放在private部分
- public的成员函数可以被外部函数调用
- private的成员函数仅能供自己的函数使用
(4)构造函数
Reader(int id, char name[]);
- 函数名和类名完全相同
- 没有返回类型
- 在对象建立时被自动调用
- 用于初始化类的对象,保证对象在创建后其数据成员都已经被正确初始化
- 每个类都至少有1个构造函数,若不写则编译器会自动加一个构造函数 类名(){ }
- 创建类的对象时会自动调用构造函数初始化对象
- 如果构造函数需要参数则声明对象时要提供相应的参数,如 Stack myStack(10);
- 有多个构造函数时,系统根据提供的参数列表确定要调用的构造函数
(5)析构函数
~Reader();
- 析构函数名是字符‘~’加上类名
- 析构函数不能指定返回类型,没有参数,不能被重载
- 当一个类没有定义任何析构函数时,系统为该类自动生成析构函数 ~类名(){ }
- 其作用是在撤销对象前为对象做最后的清理工作
- 一般为释放对象在生存期内动态分配的空间
- 在一个类的对象被撤销时,类的析构函数会被自动调用
- 析构函数一般用来释放类的对象在生存期内动态申请的空间
- C++动态申请的空间只能在程序中动态释放,系统无法自动回收
2. 类的实现
先看一段代码:
Reader::Reader(int id, char name[])
{
m_ID = id;
strcpy(m_name, name);
m_brrBooksNum = 0;
for (int i = 0; i < 10; i++)
m_brrBooks[i] = NULL;
}
void Reader::BorrowBook(Book* book)
{
m_brrBooks[m_brrBooksNum++] = book;
}
这是Reader对象的构造函数的定义,定义可以在类声明中,也可以放在源文件中。
当成员函数的实现放在类的定义的外面时,应使用作用域运算符::
注意:类的实现一般在.cpp文件中
- 每个成员函数都必须要有实现
- 类的实现可以写在类里面,也可以写在类的外面
- 写在类的外面时必须要用作用域运算符,表示该函数实现为类的成员函数
- 类的实现写在类的定义外面时一般写在对应的.cpp文件里面
三、语法应用举例
1. 对象的定义
2. 对象的使用
总结
本篇是面向对象篇章的第一部分,下一部分内容课程已经讲过,不日将继续发布博客予以总结
本篇内容:
- 面向对象程序设计
- 类的定义
- 访问控制
- 数据成员
- 成员函数
- 构造函数
- 析构函数
- 类的实现
- 对象的定义和使用