面向过程编程(编程基础:从面向过程到面向对象)

精英怪
广告

面向过程强调解决问题的步骤的组合,以函数为模块单位。

面向过程编程(编程基础:从面向过程到面向对象)

结构体可以封装数据:

#include <iostream> using namespace std; struct circle //结构体的声明 { double x,y; double r; }; void create(circle &c,double xx,double yy,double rr) { c.x=xx; c.y=yy; c.r=rr; } void draw(circle &c) { cout<<"circle:r="<<c.r<<",center@("<<c.x<<","<<c.y<<")"<<endl; } double area(circle &c) { return 3.14*c.r*c.r; } int main() { struct circle c; // 结构体变量 create(c,0,0,3); draw(c); cout<<"area="<<area(c)<<endl; cin.get(); return 0; }

运行结果:

circle:r=3,center@(0,0) area=28.26

在语法结构上,结构体强调了成员数据之间的内聚性,这是数据封装的起点。然后,还是存在明显的缺陷:

1 对象的属性与对象的行为是分离的,它们没有成为一个整体;属性和行为之间没有(在语法上)明确而稳固的关系。在上述实例中,圆的操作(行为)只是通过函数的参数与圆对象联系在一起。

2 一个circle结构体变量可以成为对象,但只能是一个简单对象,并且是被函数加工的对象。在这种情况下,可以这么说,对象的行为(函数)是主动的,对象是被动的,这与自然的思维有所区别;

3 从信息安全的角度出发,对象的属性对所有客户程序员(代码的使用者)都是公开的,也就是不受保护的。这使得客户程序员可以绕开对象创建者提供的接口函数,自己编码操纵对象的属性。这在一定程度上为所有代码带来了潜在的危害。如果circle的创建者修改了它的设计,如用外接矩形的对角点来表示一个圆,那么其他用直接方式操纵circle对象的程序员不得不修改代码,这无疑增加了代码出错的几率,同时降低了可维护性。

以上缺陷的改善就是使用类类型,类类型强调创建对象模板(类的声明和定义),通过对一组数据和对这组数据的操作的封装,以类类型对象作为名字限定,问题的解决以对象的属性和行为来实现:

#include <iostream> using namespace std; class circle //类的声明和定义 { private: double x,y; double r; public: void create(double xx,double yy,double rr) { x=xx; y=yy; r=rr; } void draw() { cout<<"circle:r="<<r<<",center@("<<x<<","<<y<<")"<<endl; } double area() { return 3.14*r*r; } }; int main() { circle c; // 类的实例化 c.create(0,0,3); c.draw(); cout<<"area="<<c.area()<<endl; cin.get(); return 0; }

完全一样的运行结果:

circle:r=3,center@(0,0) area=28.26

从结构体到类:

1 类将一组数据和对该组数据的一组操作封装在一起;

2 类中的成员函数有默认指向自身的对象指针。而在用函数操作结构体对象时,必须在有结构体引用变量作为函数的参数;

3 有了访问控制机制,数据的安全性得到了保证;

当然,以上成员函数create()完全可以用构造函数circle()来代替完成对象成员数据的初始化。

如果从基类中派生出派生类,还可以形成继承关系和多态关系。

-End-

发表评论

快捷回复: 表情:
AddoilApplauseBadlaughBombCoffeeFabulousFacepalmFecesFrownHeyhaInsidiousKeepFightingNoProbPigHeadShockedSinistersmileSlapSocialSweatTolaughWatermelonWittyWowYeahYellowdog
评论列表 (暂无评论,232人围观)

还没有评论,来说两句吧...