面向对象程序设计的4个主要特点是什么?
抽象
封装
继承
多态
类和对象体现了抽象和封装
基于以上四点的程序称为面向对象的程序设计。
什么是类?
前边我们学习过c++中的结构体,struct的使用是先声明,然后定义一个该结构体的变量,最后再初始化(赋值)
其实结构体的声明当中有很多不同数据类型的成员,在一个结构体当中,这就是对属性的封装,但是结构体与类相比较,还缺少了一个重要的环节,结构体当中只有属性,只封装了属性,但没有封装相应的操作,也就是没有封装操作成员属性的函数。
类当中有两个方面,一是封装属性,二是封装函数。在自己声明的类当中要既有属性又有函数,这就是类。
什么是对象?
在结构体中声明一个结构体就相当于我们设计了一个类,定义一个结构体就相当于我们定义了一个对象
比如 声明一个结构体相当于封装了一个类(但缺少相应的操作)
struct Student{
private int num;
string name;
float score;
string address;
这里如果再有函数就是一个类了
};
定义给两个结构体,相当于我们定义了两个对象
Student student1,student2;
初始化结构体,相当于对象的初始化
客观世界中任何一个事物都可以看成一个对象(Object),对象可以是自然物体(如汽车、狗熊)也可以是一种逻辑(如班级、连队)。
任何一个对象都有两个要素:一个是静态特征,如班级专业,班级人数,所在教室,这种静态特征称为属性。
一个是动态特征,如班级学习、班级开会、班级体育比赛,这种动态特征称为行为(或功能)。
封装的意义?
把一部分或全部属性和部分功能(函数)对外界屏蔽,就是从外界(类的大括号之外)看不到,不可知,这就是封装的意义。
实际上就是用了一个后边会介绍的关键字 private 私有化关键字来完成,就是隐蔽,比如账号的密码,你如果玩网络游戏,你的账号密码别人都可以看到,访问,所以要把它封装。
封装两个方面的含义:一是将有关数据和操作代码封装在对象当中,形成一个基本单位,各个对象之间相对独立互不干扰。
二是将对象中某些属性和操作私有化,已达到数据和操作信息隐蔽,有利于数据安全,防止无关人员修改。
类与对象之间的关系是什么?
程序设计当中,常用到抽象这个词,这个词就是解释类与对象之间关系的词。
类与对象之间的关系就是抽象的关系。
一句话来说明:类是对象的抽象,而对象则是类得特例,即类的具体表现形式。
举例说明上面的那句话:
我们都是人类,人类是不是有自己的属性,属性有年龄、名字、ID、性别,人类是不是有功能,即操作能力,能说话、能吃饭、能睡觉,能思考解决问题。
我们大家都是人类,我们彼此却又不相同,我们每一个人具有自己的属性的能力,每一个人就是人类的某一个对象。
把我们共同的属性和功能向上抽取,这就是抽象,抽象程一个人类。
继承
面向对象的继承是为了软件重用,简单理解就是代码复用,把重复使用的代码精简掉的一种手段。
如何精简,当一个类中已经有了相应的属性和操作的代码,而另一个类当中也需要写重复的代码,那么就用继承方法,把前面的类当成父类,后面的类当成子类,子类继承父类,理所当然。就用一个关键字extends就完成了代码的复用。
多态
没有继承就没有多态,继承是多态的前提。
举例来说明多态
猫、狗、鸟都是动物
动物不同于植物,猫、狗、鸟都可以叫、都可以吃
这些功能可以同时继承自动物类,猫类、狗类、鸟类都是动物类的子类
但是猫的叫声是“喵喵喵” ,狗的叫声是“汪汪汪”,鸟的叫声是“吱吱支”
猫爱吃鱼,狗爱吃骨头,鸟爱吃虫子
这就是虽然继承自同一父类,但是相应的操作却各不相同,这叫多态。
由继承而产生的不同的派生类,其对象对同一消息会做出不同的响应。
知道了以上概念就可以进行面向对象编程(Object Oriented Programming,简称OOP)
现在开始声名一个学生类:
class Student{
int num;
string name;
char sex;
void display(){
cout<<"num:"<<num<<endl;
cout<<"name:"<<name<<endl;
cout<<"sex:"<<sex<<endl;
}
};
封装一个类,然后用这个类定义两个对象
Student student1,student2;
如果是重要或是私有的信息,不让外界知道,可以进行私有化处理:
class {
private:
int num;
string name;
char sex;
public:
void display(){
cout<<"num:"<<num<<endl;
cout<<"name:"<<name<<endl;
cout<<"sex:"<<sex<<endl;
}
}student1,student2;
在C++中如果不定义private和public,则系统默认为是私有。
还可以用无名类来定义对象,必须要求封装类之后同时定义对象。
对象成员的引用或初始化
私有化的不可以这样写
不能 student1.num=100001;student1.name=”张三";针对于public:
对象调用函数 student1.display();