核心:
C++的类就是对C语言的结构体进行了扩展,C++的结构体可以包含函数!
------------------------------------------------------
我们学习C++为什么要复习C语言结构体呢?
在我看过的对C++进行讲述的教材中,开篇往往是两个字“对象”!因为C语言是面向过程的,而C++特色是面向对象!所以大多数书籍最开始就在说面向对象的事情。
但我在最初学习的过程中发现自己对“对象”这个词汇....总是想偏,对这个词汇云里雾里的,什么叫面向对象啊,看了一通没看懂。所以我们先不深究什么叫面向对象。
我们先来略看一下C语言中的结构体。对于这个大家应该是很熟悉的,如果对C语言结构体的概念有模糊,请自行查阅资料。
-----------------------------------------------------
C语言结构体
在C语言编程中,我们定义自己的身高,可以用整型int变量,定义一家人(比如三口人)的身高,可以用int型数组。
如果我们要表示某个游戏中各个角色的姓名、身高(单位cm)、体重(单位kg),这三种并不是同一类型的数据,那我们就用到结构体了。
struct hero
{
unsigned char name[10];
int height;
float weight;
};
struct hero LuBan; //定义“LuBan”变量
结构体或称结构,就像int、float等基本类型一样,也是一种数据类型,使用户自己定义的,它允许存储不同类型的数据项,就像上面的hero结构体。就像打包封装,把一些有共同特征(上面的身高体重等都属于同一个角色)的变量封装到内部,通过一定的方法访问和修改这些内部变量。
关于更多的结构体的知识我们这里不多说。
我们在结构体内部定义了一些变量,看到“LuBan”这个结构,我们就能查找到他的身高、体重等数据。
----------------------------------------------------
函数
LuBan角色具有“河豚手雷”这个技能,就像炒菜一样,油、盐、菜、蛋...出锅!这样一个顺序就完成了一道美食,LuBan也是用一个顺序完成了这个技能。左闪、右躲...杀!
这就是一个函数。
一个变量定义了一个角色的角色性质,一个函数定义了一个角色的大招使用过程!所以C语言的面向过程很好理解。
这个LuBan我们就可以叫做一个对象!他的身高、体重等这些变量我们称之为“属性”或者“状态”,他具有的大招(能干什么)我们称之为“行为”。
就像LuBan,这个角色有姓名、性别、身高、体重等这些“数量”,也就是变量=属性=状态;他可以吃饭、睡觉、打怪,这些行为=函数。所以,我们就叫C语言中的变量为“属性”或“状态”,C语言中的函数称为“行为”。
------------------------------------------------------
从结构到类
在C语言的结构体定义中,我们只是把变量放到了结构体中,而C++的类就是对C语言的结构体进行了扩展,C++的结构体可以包含函数!
举个栗子:
struct hero
{
//属性
unsigned char name[10];
int height;
float weight;
//行为
void eat()
{吃肉!} //仅做说明
void sleep()
{站着睡!}
void KillMonsters()
{使用河豚手雷打怪!}
}; //分号
struct hero LuBan; //定义“LuBan”变量
调用:
void main()
{
LuBan.height=150;
LuBan.weight=50;
LuBan.KillMonsters();
}
“角色”这个结构体的成员,与C语言不同,我们既有变量也有函数,变量和函数都属于该结构体,变量叫成员变量,函数叫成员函数。C语言的结构智能描述一个对象的属性,不能描述一个对象的行为。
在面向对象的程序设计中,对象具有属性(状态)和行为,属性保存在成员变量中,行为通过成员方法(函数)来实现。成员方法又是什么?
其实方法和函数可以理解为一回事。只是在C++中“函数”被称之为“方法”。
-----------------------------------------------------
C++类的定义
前面看明白了,这个地方就不多说话!
将结构体定义中的关键字struct换成class,就得到了C++中类的定义。
class Hero //类名习惯首字母大写
{
//属性
unsigned char name[10];
int height;
float weight;
//行为
void eat()
{吃肉!} //仅做说明
void sleep()
{站着睡!}
void KillMonsters()
{使用河豚手雷打怪!}
}; //分号
用类定义的就叫对象。
Hero LuBan; //定义了一个Hero类的对象LuBan