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