函數指針是一種指向函數的指針,允許動態呼叫函數,從而增強程式碼復用性。例如,可建立通用折扣計算函數,接受函數指標為參數,並為不同折扣類型建立不同的函數,透過傳遞不同的函數指標來實現不同折扣計算。在 C++ 中,排序策略函數指標可用於根據排序策略對學生列表排序,展示函數指標在程式碼重複使用中的應用。
函數指標是一種指向函數的指標,允許我們動態地呼叫函數。它的類型為指向函數傳回值類型(或 void)的指標。例如:
typedef int (*function_ptr)(int);
這定義了一個指向傳回 int 類型的函數的指標類型。
使用函數指標的主要優點在於其程式碼復用性。透過使用函數指針,我們可以避免重複編寫相同的程式碼段。
考慮一個場景,您有一個用於計算折扣的函數:
double calculate_discount(double price, double discount_percentage) { return price * (1 - discount_percentage); }
使用函數指針,我們可以建立一個通用的折扣計算函數,它接受函數指標作為參數:
double apply_discount(double price, function_ptr discount_function) { return discount_function(price); }
現在,我們可以為不同的折扣類型建立不同的函數,並將其傳遞給apply_discount
函數:
double flat_discount_function(double price) { // 计算固定折扣 } double percentage_discount_function(double price) { // 计算百分比折扣 }
透過這種方式,我們可以透過傳遞不同的函數指標來實現折扣的不同計算方法。
以下是一個示範如何使用函數指標增強程式碼重複使用性的C++ 程式碼範例:
#include <iostream> #include <vector> using namespace std; // 学生类 class Student { public: string name; int score; }; // 排序策略函数指针类型 typedef bool (*sort_strategy_ptr)(const Student&, const Student&); // 排序策略:按名称升序 bool sort_by_name_ascending(const Student& a, const Student& b) { return a.name < b.name; } // 排序策略:按分数降序 bool sort_by_score_descending(const Student& a, const Student& b) { return a.score > b.score; } // 根据排序策略函数指针对学生列表进行排序 void sort_students(vector<Student>& students, sort_strategy_ptr sort_strategy) { sort(students.begin(), students.end(), sort_strategy); } int main() { // 初始化学生列表 vector<Student> students = { {"John", 85}, {"Jane", 90}, {"Peter", 75}, {"Mary", 80} }; // 按名称升序排序 sort_students(students, sort_by_name_ascending); // 输出按名称排序后的列表 for (const Student& student : students) { cout << student.name << " " << student.score << endl; } // 按分数降序排序 sort_students(students, sort_by_score_descending); // 输出按分数排序后的列表 for (const Student& student : students) { cout << student.name << " " << student.score << endl; } return 0; }
在這個範例中,我們定義了一個排序策略函數指標類型,並為不同的排序規則建立了具體的函數。然後,我們將排序策略函數指標傳遞給 sort_students
函數,以所需的順序對學生清單進行排序。這展示瞭如何使用函數指標來增強程式碼的複用性。
以上是剖析 C++ 函數指標增強程式碼復用能力的原理的詳細內容。更多資訊請關注PHP中文網其他相關文章!