物件導向程式設計和`GP`泛型程式設計

俊king發表於2024-04-26

物件導向程式設計和GP泛型程式設計

c++標準庫

標準庫並不是用物件導向的概念設計出來的

物件導向的概念關鍵點:

  • classclass的繼承關係

  • 虛擬函式 -> 抽象class或者介面

物件導向庫複雜的點在於繼承關係很複雜

OOP(Object-Oriented programming)

關鍵概念:

  • class的資料放在類裡面

  • 運算元據的函式也放在類裡面

GP(Generic Programming)

泛型程式設計的關鍵概念:

  • 將資料和運算元據的方法分開來

示例程式碼:

template<typename T, class Alloc = T>
class vector
{

};

template<typename _RandomAccessIterator>
inline void sort(_RandomAccessIterator _first, _RandomAccessIterator _last) {

}

分析:

  • sort方法並沒有宣告在vector類當中

  • 呼叫sort方法取到vector的資料透過iterator迭代器

  • sort演算法透過iterator迭代器確定操作範圍,透過iterator取用container的元素

關鍵字inline

作用:

  • 將方法宣告成inline那麼在呼叫到該方法的地方會直接將方法體的內容寫到呼叫處

  • 不需要去call儲存方法的記憶體地址在進入方法進行呼叫

沒有inline

  • 函式呼叫模型就是在方法呼叫處找到函式地址然後再呼叫函式,呼叫完成回到方法執行處繼續往下執行

GP程式設計當中一個形象的例子:

  • 由於資料和處理資料的演算法分開.透過迭代器去聯絡在一起

  • 那麼例如比較大小的行為,就需要資料去定義如何比較

例如比較兩個類的大小:

示例程式碼:

#pragma
#ifndef __GPBIG__
#define __GPBIG__

#include <iostream>

using namespace std;

bool strLonger(const string& a, const string& b) {
return a.size() < b.size();
}

// 這個預設的比較大小是透過字元的ascii碼來比較大小.比較每一個碼的大小值
template<class T>
inline const T& max(const T& a, const T& b) {
return a < b ? b : a;
}

// 這個預設比較大小是透過傳入的方法進行比較.定義了一個strLonger方法來比較
template<class T>
inline const T& max(const T& a, const T& b, Compare comp) {
return comp(a, b) ? b : a;
}

#endif // !__GPBIG__

可以看到具體的比較大小的行為:

  • 有一套預設的方法去比較

  • 可以自己宣告需要的比較方式去比較

相關文章