【Day 29】Class

在铁人赛中,最後一个要来介绍的章节是 Class!我觉得这是所有章节中最难懂、最抽象的部分,真的是需要花点时间搞懂,那我们就开始ㄅ!

Class 是一个新的概念,有别於以往我们所介绍的 iffor 等程序化程序设计(procedural programming),Class 属於物件导向的程序设计(object-oriented programming),Class 其实就是 C++ 中的 Struct,因为 C 语言中的 Struct 有一些缺点,因此在 C++中就有更便利的 Class 功能发明了!

首先,我们可以根据其 visibility,可以分类出 privatepublic members。

private members
只能在同个 class 中被存取。

public members
可以在任何程序中被存取。

定义 class

(private, public 中的 statements 可以自己按照需求定义)
(myVector 为我所建立的 class name)

Class myVector {

	private:
		int n;
		int* m;

	public:
		void init(int dim);
		void print();

Constructor 建构子

Constructor 会在物件被建立时自动被呼叫,而他的名字会与 class 一样,且不会回传任何东西。
若我们没有自己定义的话,编译器会自己帮我们定义一个default constructor
写 constructor 时,可以放在 public 或 private 中,:

private:
	myVector();
public:
	myVector();

Destructor

destructor 在物件被消灭时被呼叫。与 constructor 不同的是,他只能被放在 public 中,如果我们没有自己定义的话系统一样会自己定义 default destructor。若我们要自己定义的话,前面要加上~

Public:
	~myVector();

而在 class 外,我们通常会再另外将动态记忆体释出:

myVector::~myVector() {
	delete []m;
}

Getters & Setters

有的时候,我们想用 private member,这时候可以用 getter 与 setter 来取用这个变数:

class MyVector {

	private:
		int n;
		int* m;

	public:
		// ...
		int getN() { return n; }
		void setN(int v) { n = v; }
};

Static members 静态变数

如果一个变数在所有 object 中都应该要有相同的 value 就可以运用静态变数,其对全部的 object 都会保持不变。

可以从 instance function 中存取静态变数,但是不能存 static function 中存取 instance member。

Class Window {

	private:
		// …
		static int barColor;

	public:
		static int getBarColor();
		static void setBarColor(int color);
		// …
}

int Window::barColor = 0; // 初始化,静态变数要是 global variable

int Window::getBarColor() {
	return barColor;
}
void Window::setBarColor(int color) {
	barColor = color;
}

另外,当我们要取用静态变数时,尽量用className::memberName

Static members 还有一种使用方式是计算一物件被呼叫了几次,我在这边就先不细讲。

Object pointer

最後,又要提到 pointer 了,一个 pointer 可以指向任一物件,例如,我们可以利用它来慛去一个物件的 address。

int main() {

	myVector v(5);
	myVector* ptrV = &v;
	return 0;
}

如果我们设一个物件v,而 v 中有一 instance function 叫 print(),且我们有一个 pointer ptrA 指向物件 v,我们可以写

(*ptrA).print()

来呼叫 print() 这个函数。

如果觉得太麻烦,可以简化成 ptrA->print() ,也就是:

int main() {

	myVector v(5);
	myVector* ptrV = &v;
	v.print();
	ptrV->print();

	return 0;
}

建立 object pointers 的阵列比建立 object 的阵列来的好也更 efficient,因此我们倾向建立存 object pointers 的阵列。

以上,差不多就告一段落啦!


<<:  【从零开始的Swift开发心路历程-Day29】认识GCD多执行绪Part2

>>:  【Day 26】NumPy (3):Slicing, Copy, View, shape, Concatenate

Day 17 Dockerfile 和 Docker-Compose 的差异

「撰写完 dockerfile → 转成映像档 → 建立容器」的流程虽说不复杂,但随着要建立的容器一...

D20. 学习基础C、C++语言

D20. 字串题练习 这题是之前老师出的题目但是我一直解不出来,後来看很久,还跑去问同学才解出来的,...

[Day25] - Django-REST-Framework Authencation Permission 介绍

今天我们来介绍 DRF 的 Authentication,了解 DRF 如何加入 Authencat...

成为工具人应有的工具包-01 FullEventLogView

Windows Event Log & FullEventLogView LOG 是监识调查...

D9 - 酸 V 啊酸 V8 引擎

前言 前一天提到 v8,那就再深入一点点儿讨论 V8 是什麽 以及 它 怎麽翻译 JavaScrip...