Object-oriented programming language terminology explanation

 物件導向程式語言名詞解釋

建構函式

解構函式

朋友函式

泛型類別

抽象方法

純粹虛擬函式

補充:方法與函式的異同

建構函式(constructor;建構子) 

定義:特殊的方法,它可以接受參數,也可以沒有參數,用於初始化物件的狀態
用途:用於初始化物件的狀態。當物件被建立時,它會自動被被呼叫。函式中可物件的初始值,並執行其他初始化操作,確保物件處於一個合法且一致的初始狀態。在 Java與c++ 中,建構子的名稱必須與類別名稱相同但在 C++ 中,可有多個建構子,且可重載
補充:
- 資料成員及狀態,如Car物件有speed狀態。
- 重載, overload,在同一個類別中,允許相同的函式名稱,且有不同的參數列表

解構函式

定義:用於釋放資源和清理物件所佔用的資源
用途:
- 用於釋放資源和清理物件所佔用的資源,確保不會發生資源洩漏或記憶體洩漏。
- 在物件的生命週期結束時自動被呼叫,通常用於釋放記憶體、關閉檔案或執行其他清理操作。
- 確保物件的資源管理更安全,並避免不必要的資源佔用。
- 確保資源有效回收以便重複使用。
補充:
資源洩漏,未正確釋放資源,導致資源無法有效回收和重複利用情況。

朋友函式

朋友函式(friend function) 

定義:是種定義在類別外部的函式,但可訪問該類別的私有成員。(私有成員只有在同一類別才可存取該成員)朋友函式可以是全局函式,也可以是其他類別的成員函式

使用:在 C++ 中,我們可以使用 friend 關鍵字來宣告一個朋友函式。

優點:

訪問私有成員:朋友函式允許在類外訪問該類的私有成員。這提供了一種方式來在特定情況下存取類的私有資訊,而無需將其設為公有(public)

與特定類耦合:朋友函式通常用於特定的類,因此它們提供了一種方式將相關的函式或外部功能與特定的類關聯起來,從而降低程式的耦合性。

功能性擴展:朋友函式可以擴展類的功能。它們可以通過訪問私有成員或將自己設為該類的朋友來擴展類的功能。

類之間的特權訪問:有時在兩個類之間建立友誼關係可以使這兩個類之間能夠互相訪問彼此的私有成員,從而實現某些特殊的操作。

然而,朋友函式應該謹慎使用,因為它們可能會增加程式碼的複雜性,並且破壞了封裝性。滥用朋友函式可能會導致不良的程式設計實踐。

範例:

#include <iostream>
using namespace std;
class MyClass {
private:
int privateVar;
public:
MyClass() : privateVar(0) {}
friend void friendFunction(MyClass& obj);
void setPrivateVar(int val) {
privateVar = val;
}
int getPrivateVar() const {
return privateVar;
}
};
void friendFunction(MyClass& obj) {
obj.privateVar = 100; // 修改為設定 privateVar 為 100
}
int main() {
MyClass myObj;
myObj.setPrivateVar(50); // 設定 privateVar 為 50
cout << "Before friend function call: " << myObj.getPrivateVar() << endl;
friendFunction(myObj); // 呼叫朋友函式
cout << "After friend function call: " << myObj.getPrivateVar() << endl;
return 0;
}
/*output
Before friend function call: 50
After friend function call: 100
*/

泛型類別

泛型類別(generic class) 

定義:是一種通用的類別模板(類別像個模板,可通過模板建多個物件),可以用於創建多種不同類型的物件

使用:泛型類別通常使用類型參數來實現通用性。在 Java 中,我們使用 <T> 來表示泛型類別中的類型參數。在 C++ 中,則使用 <typename T> 或 <class T> 

優點:優點在於它提供了彈性和重用性,因為它可以用於不同型別的資料,同時保持相同的程式碼結構。这種特性可以減少冗餘程式碼,並提高程式的可讀性和維護性(重用性)

範例:

// 泛型類別示例:Pair<T, U>
public class Pair<T, U> {
private T first;
private U second;
public Pair(T first, U second) {
this.first = first;
this.second = second;
}
public T getFirst() {
return first;
}
public U getSecond() {
return second;
}
public void setFirst(T newValue) {
this.first = newValue;
}
public void setSecond(U newValue) {
this.second = newValue;
}
public static void main(String[] args) {
// 使用泛型類別
Pair<Integer, String> pair1 = new Pair<>(10, "Hello");
System.out.println("Pair 1: " + pair1.getFirst() + ", " + pair1.getSecond());
Pair<Double, Boolean> pair2 = new Pair<>(3.14, true);
System.out.println("Pair 2: " + pair2.getFirst() + ", " + pair2.getSecond());
}
}

抽象方法

(abstract method) 

定義:是一種沒有實現的方法聲明,並要求繼承該抽象類別的子類別都必須實現這些方法

。使用:主要存在於 Java 中的抽象類別,只需要 abstract 修飾符標記方法即可抽象方法必須在抽象類別中聲明一個子類別只能繼承一個抽象類別。用於規範類別的基礎行為。

純粹虛擬函式

(pure virtual function) 

定義:是一種抽象方法,沒有實現,只有聲明。所有繼承自該抽象類別的子類別都必須實現這些純粹虛擬函式。

使用:主要存在於 C++ 中的抽象類別(也就是含有純虛擬函式的類別),在 C++ 中使用virtual 關鍵字搭配 = 0 來宣告

目的:abstract method與pure virtual function都是為了實現多態性讓不同的子類別能夠以不同的方式實現同一個方法,並且具有相同的介面

在c#虛擬函式可在一般類別或抽象類別中定義,聲明public virtual void method ();重寫public override void method ()。參考java語言的抽象類別與介面的差異

補充:方法與函式的異同

物件導向語言用方法,方法需

- 定義:是與物件關連的函式

- 使用:通過物件來使用

程序式語言用函式,函式需

- 定義:是一個區塊程式碼,接受輸入(參數)生輸出(結果),不一定與物件關連

- 使用:能在程式任意地方呼叫


// 抽象基類
class Shape {
public:
// 純粹虛擬函式,沒有實際實現
virtual void draw() const = 0;
// 普通成員函式
void commonOperation() {
// 可以包含實際實現的代碼
std::cout << "Common operation for shapes." << std::endl;
}
// 虛擬析構函式,通常需要在基類中擁有虛擬析構函式,以便確保在基類指針指向的派生類對象上正確銷毀
virtual ~Shape() {}
};
// 衍生類別 1
class Circle : public Shape {
public:
// 實現基類的純粹虛擬函式
void draw() const override {
std::cout << "Drawing a circle." << std::endl;
}
};
// 衍生類別 2
class Square : public Shape {
public:
// 實現基類的純粹虛擬函式
void draw() const override {
std::cout << "Drawing a square." << std::endl;
}
};
int main() {
Circle circle;
Square square;
// 透過基類指針調用純粹虛擬函式
Shape* shapePtr1 = &circle;
Shape* shapePtr2 = &square;
shapePtr1->draw(); // Drawing a circle.
shapePtr2->draw(); // Drawing a square.
// 調用普通成員函式
shapePtr1->commonOperation();
shapePtr2->commonOperation();
return 0;
}

Comments

Popular posts from this blog

Format date as yyyy-mm-dd using vbscript

How to write data into a excel file using vbscript