C++ 入门教程之五 -- Classes and Objects
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:
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 外部访问这个属性。也可以是使用关键词 private
或 protected
,下面做详细介绍。
建立一个 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 构造器,来使用不同的参数。
标签:无
有点云里雾里的。