20170519
一、面向对象编程
1.1
老师.问问题(学生) {
学生回答问题;
}
程序就是一组对象相互的发消息
一个对象都是有自己或者有其它对象构成的
每一个对象都有一个类型
相同类型的对象都能接收相同的消息(函数)
1.2 现实世界和虚拟世界
现实世界 --> 抽取这个类别的核心特征 --> 这个类型对象的功能 --> 计算机世界
学生 --> name, age, school --> 学习(), 吃饭() --> 计算机世界
特征在计算机中,功能在代码区中
计算机世界用类型和类型中的特征,创建对象
编译器负责把对象和行为联系起来
计算机中也有具体和抽象,抽象的是类型,具体的是对象
二、划分一个类别把现实中的对象描述清楚,只要把握这组对象的行为和特征
三、使用class描述一个类型的行为和特征
struct -----> class
class 所有的数据默认变为私有 private
struct 所有的数据默认变为公有 public
1 #include <iostream>
2 #include <ctime>
3 #include <cstdio>
4 using namespace std;
5 class MyTime {
6 public:
7 /*特征*/
8 int hour;
9 int min;
10 int sec;
11 /*行为*/
12 void showMyTime() {
13 printf("%02d:%02d:%02d\r", hour, min, sec);
14 fflush(stdout);
15 }
16 void setMyTime(int h = 0, int m = 0, int s = 0) {
17 hour = h;
18 min = m;
19 sec = s;
20 }
21 /*时间走一秒*/
22 void dida() {
23 sec++;
24 if(60 == sec) {
25 sec = 0;
26 min++;
27 if(60 == min) {
28 min = 0;
29 hour++;
30 }
31 }
32 }
33 void run() {
34 while(1) {
35 //sleep(1);
36 time_t t = time(NULL);
37 while(t == time(NULL));
38 dida();
39 showMyTime();
40 }
41 }
42 };
43
44 int main() {
45 MyTime mytime;
46 mytime.setMyTime(11,59,58);
47 mytime.showMyTime();
48 mytime.dida();
49 mytime.dida();
50 mytime.showMyTime();
51 mytime.run();
52 }
protected 保护权限 在类内和子类中可以访问
四、如何初始化对象
MyTime mytime;
4.1 构造函数
这个函数和类型名同名
没有返回类型
能保证在构建一个对象时自动调用一次
目的:初始化对象
如果一个类没有定义任何构造函数,则编译器自动分配一个无参的构造函数
如果提供了一个构造函数,则编译器会自动覆盖掉默认的
4.2 一个对象的创建过程
1. 编译器根据类型大小分配内存
2. 普通的成员变量不做任何操作,但如果成员变量是自定义类型就构建它
3. 调用构造函数
4.3 初始化参数列表
在构造函数调用之前执行
const类型的成员或者引用类型成员需要在构造函数之前去初始化
构造函数参数列表之后 实现体之前 要以冒号开头
1 #include <iostream>
2 using namespace std;
3 class A {
4 const int a;
5 int &b;
6 public:
7 A(int pa, int pb):a(pa), b(pb) {
8 //a = pa;
9 //b = pb;
10 }
11 void show() {
12 cout << a << " " << b << endl;
13 }
14 };
15
16 int main() {
17 A a(1, 2);
18 a.show();
19 }
4.4 头文件和实现文件分离
1. 编写头文件
定义类型, 声明全局变量, 函数声明
防止头文件的重复包含
2. 编译头文件
3. 编写实现文件
函数和全局变量在一个专门的文件中实现
类型实现 自己的实现文件
包含头文件
去掉函数的参数默认值
在每个函数名前加上类名::
4. 编译实现文件
5. 测试实现文件