引入:在我们编程语言中,想必大家都应该听说过面向过程编程与面向对象编程,那么到底什么是面向过程编程什么是面向对象编程呢?对于这个问题我想大家都应该听我们的老师讲过一个生动而又形象的例子,下面我以这个例子为大家具体的讲解释一下这两者的区别。
如何将大象装进冰箱?
面向过程(POP)
对于面向过程而言,就是分步骤去解决问题,如下
- 打开冰箱门
- 把大象放进冰箱
- 关闭冰箱门
你没看错,就是这么简单。面向过程强调的就是分步骤去解决问题,一步一步的将我们的功能实现,代表语言就是我们的C语言。具体对应于我们的语言中就是写一个一个的函数,然后依次调用函数去实现功能。
面向对象(OOP)
对于面向对象而言,它注重的并不是解决问题的步骤,而是将这个问题看成一系列对象的交互,利用对象与对象之间的交互去解决实际问题(什么是对象,不妨继续往下看看),面向对象编程是如何解决这个问题呢? 如下:
- 冰箱打开
- 冰箱存储
- 冰箱关闭
这就是面向对象的思想去解决问题,设计对象,利用对象之间的交互行为去解决问题。代表语言有C++,java,C# 等。
面向过程与面向对象的区别
面向过程
- 优点:面向过程编程性能比面向对象高,对于面向对象而言,要设计类并且实例化对象,开销比较大,耗费空间大。比如我们常用的单片机,嵌入式开发,Linux/Unix 一般采用面向过程编程,对性能要求比较高。
- 缺点:不易维护,不易扩展,不易复用。
面向对象
- 优点:可维护性高、可复用性高,可扩展性高。
- 缺点:性能相对于面向过程而言比较低。
了解了什么是面向过程与面向对象编程,那么接下来就让我们看看我们C++中的类与对象。
类与对象
基本概念:一个类是用来抽象一批对象的,类是一个抽象的概念,描述事物的共性(属性和数据)。在面向对象编程中,类的具体实例就叫做对象。举个简单的例子,类就像我们盖楼房的图纸一样,虽然图纸上面画了建筑的样式,但实际并没有开辟空间。而对象就是我们根据图纸具体实现建造出来的建筑物,它占有一定的空间。
下面让我们来看看如何定义一个类,在C++中我们有两种定义类的方式,一种是声明和定义全放在类体中,另一种是声明和定义分离。
- 类的定义
//声明和定义全放在类体中
class Person{
public: //成员方法
void eat(){
cout<<"eat food"<<endl;
}
private: //成员属性
int age;
string name;
}; //此处的分号一定要记住
//声明和定义分离
//**在.h中声明**
class Person{
public: //成员方法
void eat();
private: //成员属性
int age;
string name;
}; //此处的分号一定要记住
//在.cpp中实现
void Person::eat(){ //此处的书写格式一定要看清楚
cout<<" eat food"<<endl;
}
- 实例化对象
int main(void){
Person person1 ; //类的实例化,生成一个Person对象,占有实际空间。
return 0;
}
解释:class为定义类的关键字,Person为类的名字,{}中为类的主体,注意类定义结束时后面分号。因为我们很容易就漏写了。类中的元素称为类的成员:类中的数据称为类的属性或者成员变量; 类中的函数称为类的方法或者成员函数。定义类也可用 struct关键字。如下:
struct ClassName{
//类体
};
在这里我相信有人会问 struct 不是我们定义结构体的关键字吗?它也可以定义类吗?在这里我要给大家解释一下,C++中的结构体对C语言中的结构体进行了升级,在C语言中,我们的结构体中不能定义方法,但是在C++中可以。那么在C++中 class 关键字和 struct 关键字定义的类有区别吗? 这个我也得告诉大家,他们只有一个区别:用struct关键字定义的类默认的访问权限是公有的(public),而用class关键字定义的类的默认访问权限是私有的(private),它们仅有这一个区别,所以你用哪个定义类都可以,但是我们习惯上用class关键字。
类的访问控制权限
C++实现封装的方式:用类将对象的属性与方法结合在一块,让对象更加完善,通过访问权限选择性的将其接口提供给外部的用户使用。
【访问限定符说明】
- public修饰的成员在类外可以直接被访问
- protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的)
- 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
- class的默认访问权限为private,struct为public(因为struct要兼容C)
注意:访问限定符只在编译时有用,当数据映射到内存后,没有任何访问限定符上的区别
类的作用域
类定义了一个新的作用域,类的所有成员都在类的作用域中。在类体外定义成员,需要使用 :: 作用域解析符指明成员属于哪个类域。
class Person{
public: //成员方法
void eat();
private: //成员属性
int age;
string name;
}; //此处的分号一定要记住
//这里需要指定eat()方法是属于Person这个类域下的
void Person::eat(){
cout<<" eat food"<<endl;
}