Parameter penunjuk fungsi dalam C++ boleh menggunakan dua kaedah peruntukan memori: peruntukan dinamik atau peruntukan statik. Peruntukan dinamik menggunakan memori timbunan, memperuntukkan dan melepaskan memori pada masa jalanan menggunakan memori tindanan, dan memperuntukkan memori pada masa penyusunan.
Penunjuk fungsi ialah alat berkuasa dalam C++ yang membolehkan kami menganggap fungsi sebagai warga kelas pertama. Ini bermakna kita boleh menghantar penunjuk fungsi kepada fungsi lain, menyimpannya dalam struktur data, atau menciptanya secara dinamik.
Apabila menggunakan penunjuk fungsi sebagai parameter, kita perlu mempertimbangkan kaedah peruntukan memori. Terdapat dua kaedah utama:
Jika kami tidak pasti tentang jenis penunjuk fungsi tertentu, atau ingin menukar nilai penunjuk fungsi semasa masa jalan, kami boleh menggunakan peruntukan dinamik. Peruntukan dinamik menggunakan ingatan timbunan, contohnya:
// 创建一个指向函数的指针 int (*func_ptr)(int); // 动态分配函数指针指向的内存 func_ptr = new int(*)(int)([](int x) { return x * x; }); // 调用函数指针 int result = func_ptr(5);
Peruntukan statik boleh digunakan jika kita mengetahui dengan tepat jenis penunjuk fungsi dan tidak berniat untuk menukar nilainya pada masa jalan. Peruntukan statik menggunakan ingatan tindanan, contohnya:
// 创建一个指向函数的指针 int (*func_ptr)(int) = [](int x) { return x * x; }; // 调用函数指针 int result = func_ptr(5);
Andaikan kita mempunyai kaedah bernama Shape
的类,该类有两个派生类:Circle
和 Square
。每个派生类都有一个 calcArea
untuk mengira luasnya. Kita secara umum boleh mengira luas sebarang bentuk menggunakan hujah penunjuk fungsi seperti berikut:
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; } }; // 函数指针参数表示计算形状面积的函数 double calcArea(Shape *shape, double (*func_ptr)(Shape*)) { return func_ptr(shape); } int main() { Circle circle; Square square; // 通过函数指针动态地计算面积 double circleArea = calcArea(&circle, [](Shape *shape) { return static_cast<Circle*>(shape)->calcArea(); }); double squareArea = calcArea(&square, [](Shape *shape) { return static_cast<Square*>(shape)->calcArea(); }); }
Atas ialah kandungan terperinci Kaedah peruntukan memori untuk parameter penunjuk fungsi C++. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!