从过程性到面向对象:C++编程思维的飞跃
过程性编程 vs 面向对象编程
在编程世界中,有两种主流的思维方式:过程性编程和面向对象编程。让我们通过一个实际的例子来理解它们的区别。
想象你是垒球队的数据记录员。如果采用过程性编程方法,你会这样思考:
“我需要输入每个球员的数据,计算命中率,显示结果…我应该设计函数来处理输入、计算和显示。数据可以用结构体数组来存储。”
而如果采用面向对象编程方法,思考方式完全不同:
“我要跟踪的是’球员’这个对象。每个球员对象应该有自己的数据和操作方法:初始化、更新、显示…我需要设计一个球员类。”
核心区别:
- 过程性编程:先考虑步骤,再考虑数据
- 面向对象编程:先考虑对象,再考虑操作
C++中的类:从抽象到实现
什么是类型?
在C++中,类型不仅仅指数据的存储方式,还包括可执行的操作。例如,int类型不仅占用4字节内存,还支持加减乘除等运算。
类的定义
类是将数据和操作数据的方法组合在一起的C++工具。它实现了封装:将公有接口与实现细节分离。
让我们看一个股票类的例子:
// stock00.h - 类声明#ifndefSTOCK00_H#defineSTOCK00_H#include<string>classStock{private:std::string company;// 公司名称longshares;// 持有股数doubleshare_val;// 每股价格doubletotal_val;// 股票总值voidset_tot(){total_val=shares*share_val;}// 私有方法public:// 公有接口voidacquire(conststd::string&co,longn,doublepr);voidbuy(longnum,doubleprice);voidsell(longnum,doubleprice);voidupdate(doubleprice);voidshow();};#endif访问控制
- public:公有成员,形成类的接口
- private:私有成员,隐藏实现细节
实现类成员函数
成员函数的实现有两个关键特点:
- 使用作用域解析运算符
::标识所属类 - 可以访问类的私有成员
// stock00.cpp - 类方法实现#include<iostream>#include"stock00.h"voidStock::acquire(conststd::string&co,longn,doublepr){company=co;if(n<0){std::cout<<"股数不能为负,已设为0\n";shares=0;}elseshares=n;share_val=pr;set_tot();// 调用私有方法}voidStock::buy(longnum,doubleprice){if(num<0)std::cout<<"购买股数不能为负\n";else{shares+=num;share_val=price;set_tot();}}// 其他方法类似...内联方法
在类声明中定义的方法自动成为内联函数:
// 类内定义(自动内联)voidset_tot(){total_val=shares*share_val;}// 类外定义(显式内联)inlinevoidStock::set_tot(){total_val=shares*share_val;}使用类对象
使用类对象就像使用基本类型一样简单:
// usestock.cpp - 使用Stock类#include<iostream>#include"stock00.h"intmain(){Stock fluffy_the_cat;// 创建对象fluffy_the_cat.acquire("NanoSmart",1000,10.0);fluffy_the_cat.show();fluffy_the_cat.buy(15,18.125);fluffy_the_cat.show();// 更多操作...return0;}重要概念:
- 每个对象有自己的数据存储空间
- 所有对象共享同一套方法代码
- 调用方法时,方法操作的是调用它的对象的数据
改进实现而不影响接口
OOP的强大之处在于:可以修改内部实现而不影响外部使用:
// 改进show()方法的实现voidStock::show(){usingstd::cout;usingstd::ios_base;// 保存原格式ios_base::fmtflags orig=cout.setf(ios_base::fixed,ios_base::floatfield);std::streamsize prec=cout.precision(3);// 输出信息cout<<"公司:"<<company<<" 持股数:"<<shares<<'\n'<<"每股价格:$"<<share_val;cout.precision(2);cout<<" 总价值:$"<<total_val<<'\n';// 恢复原格式cout.setf(orig,ios_base::floatfield);cout.precision(prec);}关键要点
- 抽象是核心:关注对象做什么,而不是怎么做
- 封装是关键:隐藏实现细节,暴露清晰接口
- 类定义类型:指定数据存储和可执行操作
- 对象是实例:每个对象有自己的状态,共享行为
面向对象编程不仅仅是语法,更是一种思维方式。它让我们的代码更模块化、更易维护、更贴近现实世界的问题域。
掌握类的基本概念后,你将开启C++编程的新篇章,能够构建更复杂、更健壮的系统。记住:好的类设计始于好的抽象思考!
编程之道,始于抽象,成于封装,臻于设计。