一、基本概念
类和对象是面向对象中的两个基本概念。“类”指的是一类事物,是一个抽象的概念。“对象”指的是属于某个类的一个实体,是一个具体存在的事物。
类是一种“模板”,可以通过这种模板创建出不同的对象“实例”。
对象“实例”是类“模板”的一个具体实现。
一个类可以有很多对象,而一个对象必然属于某个类。
二、类和对象的意义
类用于抽象的描述一类事物所特有的属性和行为。
如:电脑类的每个对象都有CPU,内存和硬盘,电脑类的每个对象都可以开机和运行程序。
对象是一个具体的事物,拥有其所属类的所有属性,并且每个属性都是一个特有的值。
如:老虎的每个对象(也就是每只老虎),都有不同的体重,不同食量以及不同的性情
三、类之间的关系
1. 根据生活中的经验,我们可以把事物进行分类,类之间的界限一般都是很清晰的,如电脑类和老虎类;
2. 但是一些类可以再细分,如电脑类可以再分为Dell类,Sony类以及HP类等等;
3. 从同一个类细分出来的类和原来的类之间是有关系的,这种关系叫做继承,如HP类继承了电脑类;
4. 继承的类拥有原类的所有属性,如HP电脑就是一种电脑,HP电脑也同样的拥有CPU,内存和硬盘;
四、深入理解类
1. 不但可以抽象的描述一类事物的属性,也可以抽象的描述一类事物的行为;
2. 从同一个类细分出来的类不但继承了原有类的属性同时也继承了原有类的行为;
3. 继承出的新类可以拥有自己特有的属性和行为;
4. 属性主要用于描述类的静态特性,行为主要用于描述类的动态特性;
如:老虎类的属性有颜色,体重,而行为有捕猎和逃跑,而兔子类的属性也有颜色和体重,但是兔子类的行为没有捕猎,只有逃跑。另外,从一个更高的层面看,老虎和兔子都属于动物类,它们都继承了动物类的属性和行为,另外又又自己特定的属性和行为。
五、深入理解对象
1. 对象是一个类的实例,所谓实例即一个类中的特定的事物;
2. 一个类可以有多个实例,并且这些实例之间是互不相同的;
如:人这个类中有几十亿个不同的个体,每一个人都是人这个类的一个实例。
3. 对象和类的关系如同模具和成品的关系,类就是一个模具,利用这个模具可以生成多个不同的成品,而这些成品就是各不相同的对象;
4. 同一个类的不同对象都有对应的类中的属性和行为,但是这些属性和行为可能不完全相同;
六、类的表示方法
七、类的表示法—简化
八、类的表示法—改进1
1. 这种表示法确实比画图的方法简单,可是却没有表示出类之间的联系;
2. 关键问题是类之间的继承关系没有表示出来;
3. 继承而来的属性和行为需要重复声明;
九、类的表示法—改进2
1. 改进的方法简单明了同时也能表示出类之间的联系;
2. 但是需要划线来表示属性和行为,比较麻烦;
3. 考虑更简单的表示法;
十、类的表示法—改进3
1. 改进2的方法即简单又能够清晰的表示类之间的关系
2. 但是C++编译器却不能明白,考虑把这种方法介绍给C++编译器
3. 于是应用一些C语言的关键字和语法特性
十一、类的表示法—最终方案
1. 改进3的方法开始引入C语言的语法,将表示法推广给编译器
2. 考虑一下:是不是可以再改进一下让编译器完全读懂呢?
3. 再找共同点:每个类中只有属性和行为,属性是静态特性,行为是动态特性
4. C++编译器支持变量和函数,根据相似性考虑用变量表示属性,用函数表示行为
#include <stdio.h>
struct Biology
{
bool living;
};
struct Animal : Biology
{
bool movable;
void findFood()
{
}
};
struct Plant : Biology
{
bool growable;
};
struct Beast : Animal
{
void sleep()
{
}
};
struct Human : Animal
{
void sleep()
{
printf("I'm sleeping...\n");
}
void work()
{
printf("I'm working...\n");
}
};
int main(int argc, char *argv[])
{
Human human;
human.living = true;
human.sleep();
human.work();
printf("Press any key to continue...");
getchar();
return 0;
}
十二、类之间的基本关系
继承
- 从已存在类细分出来的类和原类之间具有继承关系(is-a)
- 继承的类(子类)拥有原类(父类)的所有属性和行为
组合
- 一些类的存在必须依赖于其他的类,这种关系叫组合
- 组合的类在某一个局部上由其他的类组成