c++++ 中函數(shù)指針參數(shù)可以采用動態(tài)分配或靜態(tài)分配兩種內(nèi)存分配方式。動態(tài)分配使用堆內(nèi)存,在運(yùn)行時分配和釋放內(nèi)存;靜態(tài)分配使用棧內(nèi)存,在編譯時分配內(nèi)存。
C++ 函數(shù)指針參數(shù)的內(nèi)存分配方式
函數(shù)指針是 C++ 中一種強(qiáng)大的工具,它允許我們將函數(shù)視為一等公民。這意味著我們可以將函數(shù)指針傳遞給其他函數(shù)、存儲在數(shù)據(jù)結(jié)構(gòu)中,甚至動態(tài)地創(chuàng)建它們。
當(dāng)使用函數(shù)指針作為參數(shù)時,我們需要考慮內(nèi)存分配方式。有兩種主要方法:
1. 動態(tài)分配
如果我們不確定函數(shù)指針的具體類型,或者希望在運(yùn)行時更改函數(shù)指針的值,則可以使用動態(tài)分配。動態(tài)分配使用堆內(nèi)存,例如:
// 創(chuàng)建一個指向函數(shù)的指針 int (*func_ptr)(int); // 動態(tài)分配函數(shù)指針指向的內(nèi)存 func_ptr = new int(*)(int)([](int x) { return x * x; }); // 調(diào)用函數(shù)指針 int result = func_ptr(5);
登錄后復(fù)制
2. 靜態(tài)分配
如果我們確切地知道函數(shù)指針的類型,并且不打算在運(yùn)行時更改它的值,則可以使用靜態(tài)分配。靜態(tài)分配使用棧內(nèi)存,例如:
// 創(chuàng)建一個指向函數(shù)的指針 int (*func_ptr)(int) = [](int x) { return x * x; }; // 調(diào)用函數(shù)指針 int result = func_ptr(5);
登錄后復(fù)制
實戰(zhàn)案例
假設(shè)我們有一個名為 Shape
的類,該類有兩個派生類:Circle
和 Square
。每個派生類都有一個 calcArea
方法來計算其面積。我們可以使用一個函數(shù)指針參數(shù)來通用地計算任何形狀的面積,如下所示:
class Shape { public: virtual double calcArea() = 0; }; class Circle : public Shape { public: double calcArea() override { return 3.14; } }; class Square : public Shape { public: double calcArea() override { return 4.0; } }; // 函數(shù)指針參數(shù)表示計算形狀面積的函數(shù) double calcArea(Shape *shape, double (*func_ptr)(Shape*)) { return func_ptr(shape); } int main() { Circle circle; Square square; // 通過函數(shù)指針動態(tài)地計算面積 double circleArea = calcArea(&circle, [](Shape *shape) { return static_cast<Circle*>(shape)->calcArea(); }); double squareArea = calcArea(&square, [](Shape *shape) { return static_cast<Square*>(shape)->calcArea(); }); }
登錄后復(fù)制