c++学习之面向对象

来源:互联网 发布:步进电机控制器编程 编辑:程序博客网 时间:2024/05/16 14:59

        面向对象,如今特别火的一个词,英文是object。我所理解的是面向对象是这样的:

        程序 = 算法+数据结构。算法也就是我们使用的代码,数据结构就是我们操作的数据,在编程的世界里面,程序员所面对的就是这两样的东西,算法操作数据。但是对象的出现,将此两样东西统一起来,特定的算法应用在特定的数据结构上面,对外表现出一个统一的整体。因此,我们可以理解,我们在定义一个类的时候,总是常常将数据定义为私有,函数定义为public,这样,在这个统一的对象中,我们仅能通过该对象的函数来操作这些数据,如果将数据定义为public,在语法上是可行的,但是会破坏了对象的封装,因为在很多情况下,数据的变化是会影响代码执行的,因此,如果将数据定义为public,站在维护的角度来说,我们很难找到出错的原因,因为我们不知道数据的状态都由谁来操作了。本人做java开发3年,面向对象,纯的,至今看了c++ primer中关于面向对象的解释,才理解到这些。汗颜呀。

        好了,我们来看看如何定义一个对象吧。看如下代码:

class Rectangle{private:int x;int y;public:Rectangle(int,int);~Rectangle();int area();};

        通常情况下,我们会按照如上格式来定义一个对象,注意{}结束处,需要使用分号。另外,在定义中,我们仅仅声明函数,但是不具体实现,针对特定的函数,如果实现代码在2行以内,我们可以将函数的实现放到定义里面来,至于有什么区别,是这样的:在对象定义中实现函数,在运行时,c++会尽可能的将此函数进行内联,如果在外面单独实现函数,那么,函数的执行将不会被内联。内联操作比函数调用的效率高很多,至于原因,你懂的。

        来看看完整的实现吧

class Rectangle{private:int x;int y;public:Rectangle(int,int);~Rectangle();int area();};Rectangle::Rectangle(int a,int b){cout << "Rectangle construct..." << endl;x = a;y = b;}Rectangle::area(){return x*y;}Rectangle::~Rectangle(){cout << "Rectangle deconstruct.." << endl;}
        以上需要说明的是,area()函数其实是可以放在该函数的定义中。

        Rectangle(int a,int b)是对象的构造函数,定义的时候使用了::,该操作符说明了定义的函数,是属于的某个类的。

~Rectangle()是对象的析构函数,在对象运行结束后,该函数自动执行,用于释放该对象所占用的系统资源,将其归还给操作系统。如果没有定义这个函数,可能会内存泄露恶。。

        来看个使用例子吧。

int main(){Rectangle r(5,6);Rectangle *rect = new Rectangle(3,4);cout << "r's size is :" << r.area() << endl;cout << "rect's size is: " << rect->area() << endl;return 0;}

        运行结果如下:

                

        看到这个结果,如果大概的看一下,是没问题的,两个对象的area()函数返回成员变量的乘积。但是仔细留意一下,发现其中一个函数没有执行析构函数。原因是该对象是指针引用的。我们操作完成后,并没有释放该指针。

        正确的代码如下:在上面的代码中加入下面标红色的代码即可。

int main(){Rectangle r(5,6);Rectangle *rect = new Rectangle(3,4);cout << "r's size is :" << r.area() << endl;cout << "rect's size is: " << rect->area() << endl;delete rect;return 0;}
        执行结果如下:

                 


        至此,c++中对象的基本使用就完成了,这里只是记录一个基本的知识,还有很多我也不懂,本人还在慢慢学习中....

        将这里的代码统一记录在下来,需要使用的童鞋,可以直接复制下来就能运行了。

#include <iostream>using namespace std;class Rectangle{private:int x;int y;public:Rectangle(int,int);~Rectangle();int area();};Rectangle::Rectangle(int a,int b){cout << "Rectangle construct..." << endl;x = a;y = b;}Rectangle::area(){return x*y;}Rectangle::~Rectangle(){cout << "Rectangle deconstruct.." << endl;}int main(){Rectangle r(5,6);Rectangle *rect = new Rectangle(3,4);cout << "r's size is :" << r.area() << endl;cout << "rect's size is: " << rect->area() << endl;delete rect;return 0;}