2 什么是面向对象
对象=属性(是什么)+服务(提供什么)
面向过程:按照时间顺序,一步步发生什么样的事情。
面向对象:场景中存在什么东西object,东西间的关系如何。
以上课为例:略。
以程序为例:C的struct中只有数据,C++的class中有数据和操作。
什么是面向对象:是一种分析思路和代码实现的方法。重点是关注问题领域中存在什么物件,而不是整个流程。
3 面向对象基本原理
对象间通过发送和接受消息来行动。(不要伸手直接操纵”蛋黄“)
消息:由发送方撰写,由接收方分析,通过方法来实现。消息可能导致接收方更改状态或返回结果。
东西Object:具体到某一个实体。
类Class:某一类实体的集合,是一种概念。
面向对象的五条原则:
- 所有东西都是对象。
- 程序是一个通过发送消息的方式,告诉彼此应该做什么what to do的对象集合。
- 每一个对象有由其他对象组成的内存。
- 每一个对象有一个类型。
- 一个特定类型的所有的对象都可以接收相同的消息。
接口Interface的作用:交流和保护。
内部的隐藏:让类的创造者更改类的内部,而让类的使用者远离类的内部。
面向对象的三大原则:
- 封装Encapsulation
- 将数据和处理这些数据的方法捆绑在一个对象中
- 隐藏数据和操作的详细信息
- 仅限制对公开方法的访问
- 继承
- 多态性
4 自动售票机例子
- 直接创建TicketMachine的类,自动生成相应的**.h头文件和.cpp文件**。
- h头文件:声明类。
#ifndef TICKETMACHINE_H_ //如果这个头文件没有被包含
#define TICKETMACHINE_H_ //就包含这个头文件并且定义这个变量
class TicketMachine {
public:
TicketMachine(): //构造函数
virtual ~TicketMachine(); //析构函数
void showPrompt();
void insertMoney(int money);
void showBalance();
void printTicket();
void showTotal();
private:
const int PRICE;
int balance;
int total;
};
#endif /* TICKETMACHINE_H_ */
- cpp文件:先#include TicketMachine.h,再定义头文件中声明的类的实体。
#include "TicketMachine.h";
#include <iostream>
using namespace std;
TicketMachine::TicketMachine() : PRICE(0) {
}
TicketMachine::~TicketMachine() {
}
void TicketMachine::showPrompt() {
cout << "something";
}
void TicketMachine::insertMoney(int money) {
balance += money;
}
void TicketMachine::showBalance() {
cout << balance;
}
void TicketMachine::printTicket() {
cout << "Ticket";
}
void TicketMachine::showTotal() {
cout << total;
}
- 再手动创建一个main.cpp进行类的调用,需要#include TicketMachine.h。
#include "TicketMachine.h";
int main() {
TicketMachine tm;
tm.insertMoney(100);
tm.showBalance();
return 0;
}
::域的解析符:表示范围。
<Class Name>::<function name> //某个域内的函数
::<function name> //全局的函数
5 头文件
区分声明declaration(存放在头文件中)和定义definition(存放在cpp文件中)。
C/C++程序的编译运行过程:
- 预处理指令生成.i文件
- 头文件的包含;
- 删除所有#define并替换所有的宏和标识符常量;
- 删除所有条件编译指令和注释。
- 编译器生成.s文件
- 词法分析、语法分析、语义分析、符号汇总以及后续优化产生相应的汇编语言。
- 汇编器生成.o文件
- 将汇编语言转化为二进制指令。
- 链接器生成.out文件
- 进行合并段表和符号汇总两个操作从而形成一个可执行程序。
- 链接是机器可以检查出变量/函数是否定义的一步
- 在windows系统中,文件的变化:.c -> .obj -> .exe(编译的三步一般一步到位)
- 在linux系统中,文件的变化:.c -> .i ->.s -> .o -> .out
#include “xx.h”:首先在当前目录寻找
#include <xx.h>:在系统指定目录寻找
#include :同上
6 时钟的例子
抽象Abstraction:是指忽略部分细节,将注意力集中在更高层次的问题上的能力。
模块化Modularization:是将一个整体划分为定义明确的部分的过程。这些部分可以单独构建和检查,并且以定义明确的方式相互作用。
class ClockDisplay {
NumberDisplay hours;
NumberDisplay minutes;
}
class NumberDisplay {
int limit;
int value;
}
7&8 成员变量
成员变量fileds:在一个函数内部定义的变量,值与函数无关,作用域在类的内部。
本地变量local variables:值与函数有关,作用域在函数的内部,存放在堆栈中。
函数参数parameters:同上。
同名时:则按照“就近原则”。
this是C++的关键字,是一个指针,类型是这个函数所属的类的对象的类型。
9 构造和析构
Visual Studio中编译时分为Release和Debug模式,其中Debug模式包含了调试信息和安全检查,未初始化的栈空间用0xCC填充,而未初始化的堆空间用0xCD填充,而0xCCCC和0xCDCD在中文GB2312编码中分别对应“烫”字和“屯”字。
构造函数:在对象被创建时自动调用(可传入参数对其初始化)。
目的是保证对象一旦被创建就被初试化。
class X {
public:
X();
}
析构函数:在对象被消除时自动调用(不能含参数)。
目的是释放空间和资源。
class Y {
public:
~Y();
}