尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

23种设计模式精解:从入门到实战(二)面向对象

23种设计模式精解:从入门到实战(二)面向对象 C 面向对象与面向过程从对比到实践两种编程范式的核心差异面向过程以函数为中心程序由一系列函数调用顺序驱动。数据通过参数在函数间传递状态通常存储在全局变量或栈内存中。面向对象以对象为中心将数据和操作数据的行为封装在类中。通过实例化对象进行交互对象的内部状态由成员变量维护行为由成员函数实现。维度面向过程面向对象程序结构函数调用顺序决定对象关系决定数据与行为分离数据服务于函数封装在对象内部状态存储全局变量 / 栈内存成员变量扩展方式修改函数逻辑继承 多态访问控制无函数全局可见public / private / protected代码对比大象装冰箱同一个场景两种写法的差异一目了然。面向过程实现#include iostream using namespace std; void openDoor() { cout 冰箱门打开 endl; } void putElephant() { cout 放入大象 endl; } void closeDoor() { cout 冰箱门关闭 endl; } int main() { openDoor(); putElephant(); closeDoor(); return 0; }三个独立函数按顺序调用数据冰箱容量、大象体型没有被建模只是硬编码在输出中。面向对象实现#include iostream #include string using namespace std; class Refrigerator { private: int capacity; public: Refrigerator(int cap) : capacity(cap) {} void openDoor() { cout capacity L 容量的冰箱门打开 endl; } void closeDoor() { cout 冰箱门关闭 endl; } }; class Elephant { private: string size; public: Elephant(const string sz) : size(sz) {} void move() { cout size 体型的大象移动 endl; } }; int main() { Refrigerator fridge(500); Elephant elephant(大型); fridge.openDoor(); elephant.move(); fridge.closeDoor(); return 0; }冰箱和大象被建模为独立的类各自维护自己的状态容量、体型行为封装在成员函数中。新增需求比如检查冰箱容量是否够装只需在对应类中扩展不需要改动其他函数。再看一个例子牛郎织女面向对象的另一个优势是职责划分清晰。牛郎、织女、红娘各有各的行为互不干扰#include iostream #include string using namespace std; class WeaverGirl { public: void spin() { cout 织女操作纺车 endl; } }; class Cowherd { public: void findCow() { cout 牛郎寻找牛 endl; } }; class Matchmaker { public: void arrangeMeeting(Cowherd c, WeaverGirl w) { cout 红娘协调双方见面 endl; } }; int main() { WeaverGirl weaver; Cowherd cowherd; Matchmaker matchmaker; cowherd.findCow(); weaver.spin(); matchmaker.arrangeMeeting(cowherd, weaver); return 0; }如果用面向过程写三个角色的行为会变成三个全局函数数据通过参数传来传去角色之间的关系很难直观体现。性能考量两种范式没有绝对的优劣关键看场景面向过程的优势函数调用开销小没有虚函数表的间接寻址内存占用通常更低不需要为对象分配额外空间适合性能关键代码如高频循环、底层算法面向对象的优势代码组织更清晰职责边界明确适合大型项目的长期维护虚函数支持运行时多态扩展灵活实际开发中虚函数的性能开销在绝大多数场景下可以忽略不计只有在极端性能敏感的热路径上才需要权衡。现代 C 与混合编程现代 C 并不要求纯面向对象而是鼓励根据场景选择合适的范式智能指针unique_ptr/shared_ptr管理对象生命周期避免手动内存管理移动语义优化大对象的传递开销lambda 表达式支持函数式编程风格适合短小的回调逻辑模板实现泛型编程与面向对象正交互补实践中的混合编程建议性能关键模块如算法核心、数据处理采用过程式用struct组织纯数据系统架构层如模块划分、接口设计采用面向对象用类封装状态和行为用namespace组织相关的全局函数避免命名冲突小结面向过程和面向对象不是非此即彼的对立关系。面向过程适合短小、性能敏感的逻辑面向对象适合复杂、需要长期维护的系统。现代 C 的最佳实践是在架构层面用对象组织代码在性能热点用过程式优化两者结合才能发挥最大价值。
返回列表