Object-oriented programming language terminology explanation
物件導向程式語言名詞解釋
建構函式
解構函式
朋友函式
泛型類別
抽象方法
純粹虛擬函式
補充:方法與函式的異同
建構函式(constructor;建構子)
解構函式
朋友函式
朋友函式(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 = □ | |
shapePtr1->draw(); // Drawing a circle. | |
shapePtr2->draw(); // Drawing a square. | |
// 調用普通成員函式 | |
shapePtr1->commonOperation(); | |
shapePtr2->commonOperation(); | |
return 0; | |
} |
Comments
Post a Comment