iT邦幫忙

2021 iThome 鐵人賽

DAY 29
0
Software Development

C++ 三十天學習紀錄系列 第 29

【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 的陣列。

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


上一篇
【Day 28】Self - defined Data Types
下一篇
【Day 30】結語
系列文
C++ 三十天學習紀錄30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言