Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Kaedah peruntukan memori untuk parameter penunjuk fungsi C++

Kaedah peruntukan memori untuk parameter penunjuk fungsi C++

WBOY
WBOYasal
2024-04-20 21:09:021031semak imbas

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.

C++ 函数指针参数的内存分配方式

Cara memori diperuntukkan untuk parameter penuding fungsi dalam C++

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:

1. Peruntukan dinamik

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);

2. Peruntukan statik

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);

Kes praktikal

Andaikan kita mempunyai kaedah bernama Shape 的类,该类有两个派生类:CircleSquare。每个派生类都有一个 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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn