面向对象
-
面向过程编程:
- 数据和函数分离:在C语言中,数据和函数是分开定义和操作的。数据是通过全局变量或传递给函数的参数来传递的,函数则独立于数据。
- 函数为主导:C语言以函数为主导,程序的执行流程由函数调用和返回来控制。
- 缺乏封装性:C语言中没有类和对象的概念,无法将数据和相关函数封装在一起。数据和函数在代码中是松散组织的。
-
面向对象编程:
- 类和对象:C++引入了类和对象的概念,允许将数据和操作数据的函数封装在一起。类是一个模板,用于创建对象的实例。
- 封装和数据隐藏:C++中的类提供了封装的机制,可以将数据和相关函数封装在类的内部,并限制对类的私有成员的访问。这样可以隐藏数据的具体实现细节,提高代码的安全性和可维护性。
- 继承:C++支持继承机制,允许创建新的类(派生类)通过继承现有类(基类)的属性和行为。继承可以实现代码的重用和扩展。
- 多态性:C++支持多态性,允许通过虚函数和函数重写实现在不同对象上执行相同的操作产生不同的行为。这提供了更灵活和可扩展的代码设计。
- 动态内存管理:C++提供了new和delete操作符,用于动态分配和释放内存。这使得在运行时动态创建、修改和销毁对象成为可能。
-
人把大象放进冰箱
-
面向过程
- 打开冰箱
- 放进大象
- 关闭冰箱
-
面向对象
- 人 - 冰箱 - 大象(对象)
- 人 - 打开和关闭冰箱,将物品放入冰箱
- 冰箱 - 开门以及关门
- 大象 - 进入冰箱属性
-
类结构体
-
相同点
- 成员变量:类和结构体都可以包含成员变量,用于存储数据。
- 成员函数:类和结构体都可以包含成员函数,用于操作数据和提供其他功能。
- 访问修饰符:类和结构体都可以使用访问修饰符(public、private、protected)来控制成员的访问权限。
- 对象实例化:类和结构体都可以通过创建对象的实例来使用。
-
不同点
- 默认访问修饰符:类的默认访问修饰符是"private",而结构体的默认访问修饰符是"public"。
- 继承:类支持继承机制,可以通过继承实现类与类之间的关系,而结构体不支持继承。
- 对象的拷贝:通过赋值操作符("=")或拷贝构造函数创建类对象的副本时,会复制对象的状态和数据。而结构体对象的拷贝只是简单地复制值。
-
示例
#include <iostream> typedef struct _Person { public: //公共属性 -> 结构体内外都可以访问 //成员变量(对象属性) int m_Sex; //0 = nan 1 = nv int m_Age; //成员函数 void SetAge(int age) { m_Age = age; } int GetAge() { return m_Age; } }Person, *PPerson; class Animal { private: //私有属性 -> 类内部可以访问,类外部不可以访问 //成员变量(对象属性) int m_Sex; //0 = nan 1 = nv int m_Age; public: //成员函数 void SetAge(int age) { m_Age = age; } int GetAge() { return m_Age; } }; int main() { //结构体 Person p1 = { 0 }; p1.m_Age = 18; p1.m_Sex = 0; printf("age -> %d sex -> %s \r\n", p1.m_Age, (p1.m_Sex == 0 ? "男" : "女")); Person p2 = { 0 }; p2.SetAge(20); std::cout << p2.GetAge() << std::endl; //类 Animal Dog; Dog.SetAge(1); std::cout << Dog.GetAge() << std::endl; return 0; }