结构化程序

概念

C/C++采用结构化程序设计:

$$ Program = Data\ Structure\ +\ Algorithm $$

  • 程序由全局变量以及众多相互调用的函数组成
  • 算法以函数的形式实现,用于对数据结构进行操作

结构化程序示例图

弊端

  1. 结构化设计程序中,函数和其所操作的数据结构没有直观的联系
  2. 随着程序规模的增加,程序逐渐难以理解,很难一下子看出来:

    • 某个数据结构到底有哪些函数可以对它进行操作
    • 某个函数到底是用来操作哪些数据结构的
    • 任何两个函数之间存在怎样的调用关系
  3. 同时没有封装和隐藏的概念

    要访问某个数据结构中的变量,要通过直接访问的形式

    但是如果数据结构本身发生了变化,需要重写所有访问其的代码,不利于程序的维护和扩充

  4. 难以查错,某个数据结构构建后的值不正确时,难以查找是哪个函数导致的
  5. 随着程序规模扩大,函数与变量之间的关系复杂,无法重用之前代码

简单来说,结构化程序在规模庞大时:

  • 难以理解
  • 难以扩充(增加新功能)
  • 难以查错
  • 难以重用

而软件业要更快,更正确,更经济的建立软件,所以我们引入面向对象来解决这些问题

面向对象的程序设计

概念

面向对象的程序设计方法,能够较好的解决上述问题

$$ Program = Class\ +\ Class\ +\ ...\ + Class $$

设计程序的过程,就变成了设计类的过程(类本身的属性和类之间的关系)

优势

  1. 将某类客观事物的共同特点(属性)归纳出来,形成一个数据结构(可以用于多个变量描述事物的属性)
  2. 将某类事物所能进行的行为也归纳出来,形成一个个函数,这些函数只可以操作自己包含的数据结构(即“抽象”)
  3. 使用某种语法形式,将数据结构和函数绑定在一起,形成了,从而使得数据结构和操作的函数呈现出显而易见的紧密关系(即“封装”)

总体上来说,面向对象的程序设计具有

  • 抽象
  • 封装
  • 继承
  • 多态

四种基本特点

OOP结构

类和对象

写一个程序,输入矩形长和宽,输出面积和周长。

  • 属性:长和宽
  • 行为/操作:设置长和宽,计算面积,计算周长等等

我们把属性和三个函数封装一起,成为了矩形类。

我们把长、宽叫做矩形类的成员变量,三个函数叫做该类的成员函数,实际上类看起来就像是个带函数的数据对象

class CRectangle{
    public:
        int w,h;
        int Area(){
            return w*h;
        }
        int Preimeter(){
            return 2*(w+h);
        }
        void Init(int w_,int h_){
            w = w_;h=h_;
        }
};    //必须有分号

int main(){
    CRectangle r;
}

我们把实例化后的,叫做对象

对象的内存分配

struct一样,对象所占用的内存空间大小等于所有成员变量大小之和,成员函数会入栈,被所有的对象共享

每个对象都有自己的存储空间,每一个都互相隔离

对象间的运算

对象间可以用=进行赋值(注意,是真实的复制一遍!)

如果想用==,!=,>,<,>=,<=等等,需要先重载运算符

如何使用类的成员变量和成员函数

  1. 对象名.成员名

    CRectangle r1;
    r1.w = 5;
  2. 指针->成员名

    CRectangle r1;
    CRectangle* p1 = & r1;
    p1->w = 5;
    //或者
    CRectangle* p2 = new CRectangle;
    p2->w = 5;
  3. (*指针).成员名
  4. 引用.成员名

    CRectangle r1;
    CRectangle& rr = r1;
    rr.w = 4;
Last modification:March 15th, 2020 at 10:41 am
Compared with money, your comment could inspire me more.
相较于钱财,你的留言更能激发我创作的灵感