object 对象

Object Oriented Programming 面向对象编程是为了让编程更加接近于真实世界的理解方式。在程序中,每个 object 是一个独立的 unite 单元,拥有自己的 identify 标识,就像真实世界的某个独立物体一样。

例如一个苹果就是一个 object,它的 identify 就是名称 苹果,每个苹果都有自己独立的 attributes 属性,如颜色,大小。一个属性就是这个 object 当前状态的描述。不同 object 的 attributes 属性是不一样的,例如一个苹果是绿色的,另一个是红色的。

在正式世界中 object 都有其 behave 行为,例如汽车的 move 移动,手机的 ring 响铃。这种 object 的行为叫做 object 的 type 类型。

描述一个 object需要的元素:identify 标识,attributes 属性,behavior 行为

在程序中每个 object 是独立的,拥有独立的 identify 用来区分其他的 object:
1.png

class

我们通过创建 class 来表示 object,一个 class 描述了一个 object 的形象,但是它并不是一个真正的 object,他只是一个对某种 object 结构的定义。一个 class 可以用来建立多个 object。例如一套设计图纸可以用来作为蓝图修建多栋楼房。

一个 class 包含:identify,attributes,behavior

程序中,一个对象的 type 就是 class 的 name 名称;Attributes 属性可以是 properties 或 data 数据;behavior 行为通常是一个 function。

例如我们建立一个银行系统程序:

  • name: BankAccount
  • attributes: accountNumber, balance, dateOpened
  • behavior: open(), close(), deposit()

一个 class 定义了某种 object 需要的属性和行为。但是它并不直接定义具体的属性值是多少,她只是一个框架的描述。

当我们写好了一个 class,可以基于这个 class 来创建 objects,这个 object 就是 instance of class,就是 class 的实例。

建立 class

使用关键字 class 来建立 class,然后定义 class 名称,class 内容写在大括号{} 内。注意每个 class 结尾必须写分号;。例如:

class BankAccount {

};

一个 class 的 attributes 和 behaviors 可以设置 access 访问级别。定义时使用关键词 public 不仅可以在 class 内部使用,也可以在 class 外部访问这个属性。也可以是使用关键词 privateprotected,下面做详细介绍。

建立一个 class:

class BankAccount {
  public:
    void sayHi() {
      cout << "Hi" << endl;
    }
};

然后 instance 实例化这个 class:

int main() 
{
  BankAccount test;
  test.sayHi();
}

实例化的 object test 拥有其 class 所有的属性和行为。使用点分割符. 来访问 object 的各种属性和 function。

抽象化

数据抽象化的理念是给外部环境提供最核心的信息,而不用提供具体的细节。比如我们抽象化一本书,我们不用知道他具体有多少也,多少个字,什么颜色。我们只需要知道它是一本书就行了。

抽象化的理念是面向对象编程最基础的模块。可以让我们建立一个 class 模型,然后基于这个模型创建具体的 objects 对象。

封装

encapsulation 封装意味着将一个整体包围起来,不仅仅是将其内容放在一起,也可以将其保护起来。它的设计原则就是让外部程序只能够访问其开放的元素,其他内容保持隐藏状态。

例如我们上面的 BankAccount class,我们不想要外部直接访问修改 balance 余额属性,我们需要其使用 deposit()withdraw() 方法来对其进行操作。所以我们需要将 balance 属性对外隐藏掉,只能通过内部 function 来访问。

封装的优势有:

  • 控制内部数据的访问和修改
  • 代码更加灵活,方便后续根据情况修改
  • 修改一个地方,不影响其他地方

下面举例说明如何使用封装来控制内部数据的可访问性,使用 public,private,protected 关键词。

注意如果没有使用关键词,默认 class 内所有都是 private 类型的。

访问 public 的数据:

#include <iostream>
#include <string>
using namespace std;

class myClass {
  public:
    string name;
};

int main() {
  myClass myObj;
  myObj.name = "SoloLearn";
  cout << myObj.name;
  return 0;
}

//Outputs "SoloLearn"

使用 public 关键词定义可被外部访问的属性,注意关键词后的冒号:

使用 private 保护内部数据:

#include <iostream>
#include <string>
using namespace std;

class myClass {
  public:
    void setName(string x) {
      name = x;
    }
  private:
    string name;
};

int main() {
  myClass myObj;
  myObj.setName("John");

  return 0;
}

name 不可以被外部直接访问修改,但是通过 setName() 就可以间接修改 name 的值。

也可以通过 function 间接读取 private 的某些属性:

class myClass {
  public:
    void setName(string x) {
      name = x;
    }
    string getName() {
      return name;
    }
  private:
    string name;
};

以上示例,通过建立 public 里的 getName() 方法来读取 name 的值。

constructor 构造器

constructor 是 class 中特殊的 function,这个 function 的名称和 class 名称一样且没有返回类型,甚至没有 void,它会在 instance 实例化 object 时自动被执行,例如:

class myClass {
  public:
    myClass() {
      cout <<"Hey";
    }
    void setName(string x) {
      name = x;
    }
    string getName() {
      return name;
    }
  private:
    string name;
};

int main() {
  myClass myObj;

  return 0;
}

//Outputs "Hey"

以上示例中,在实例化 myObj 时,会自动执行构造器 function。

构造器 function 可以方便的让我们在实例化 class 时设置 initial 初始化参数。默认构造器没有参数,如果需要的话我们可以加入参数。例如:

class myClass {
  public:
    myClass(string nm) {
      setName(nm);
    }
    void setName(string x) {
      name = x;
    }
    string getName() {
      return name;
    }
  private:
    string name;
};

int main() {
  myClass ob1("David");
  myClass ob2("Amy");
  cout << ob1.getName();
}
//Outputs "David"

以上示例中,构造器的作用是使用一个参数给 private name 赋值。当实例化这个 class 时,需要传入构造器需要的参数。

注意我们可以在一个 class 中建立多个 constructor 构造器,来使用不同的参数。

标签: none

仅有一条评论

  1. ahxinny ahxinny

    有点云里雾里的。

添加新评论