C++ 函数指针
文章目錄
- 基礎介紹
- 代碼
- 普通函數指針
- 函數指針作為參數傳遞給函數
- 函數指針數組
- 指向類成員函數的函數指針
基礎介紹
1、對于普通函數名直接就代表著函數地址
2、對于類成員函數需要在函數前加上類修飾符
函數指針:
函數指針也是一種類型,可以聲明,賦值。
類內的靜態函數和普通函數可以用同樣的方式使用,就是直接利用函數指針執行,而類的普通成員函數的使用需要加上類的實例在前面,解引用的符號也不一樣需要加上*
代碼
普通函數指針
//**********************普通函數指針********************** #include<iostream> using std::cout; using std::endl;int test(int a) {return a; }int main() {int (*fp)(int a); //聲明了一個函數指針fp = test; //給函數指針賦值了cout << fp(2) << endl;return 0; }函數指針作為參數傳遞給函數
//*********************函數指針作為參數傳遞給函數************** #include<iostream> using std::cout; using std::endl;int test(int a) {return a; } int test2(int (*fun)(int), int b) {int c = fun(b) + b;return c; }int main(int argc, const char* argv[]) {typedef int (*fp)(int a);fp f = test;cout << test2(f, 1) << endl; // 調用 test2 的時候,把test函數的地址作為參數傳遞給了 test2return 0; }函數指針數組
//*****************函數指針數組*************** #include<iostream> using std::cout; using std::endl;void t1() { cout << "test1" << endl; } void t2() { cout << "test2" << endl; } void t3() { cout << "test3" << endl; }int main(int argc, const char* argv[]) {typedef void (*fp)(void);fp b[] = { t1,t2,t3 }; // b[] 為一個指向函數的指針數組b[0](); // 利用指向函數的指針數組進行下標操作就可以進行函數的間接調用了b[1]();b[2]();return 0; }指向類成員函數的函數指針
//*******************指向類成員函數的函數指針***************** //對于 nonstatic member function (非靜態成員函數)取地址,獲得該函數在內存中的實際地址 //對于 virtual function(虛函數), 其地址在編譯時期是未知的,所以對于 virtual member function(虛成員函數)取其地址,所能獲得的只是一個索引值 //指向類成員函數的函數指針 #include <iostream> #include <cstdio> using namespace std;class A { public:A(int aa = 0) :a(aa) {}~A() {}void setA(int aa = 1){a = aa;}virtual void print(){cout << "A: " << a << endl;}virtual void printa(){cout << "A1: " << a << endl;} private:int a; };class B :public A { public:B() :A(), b(0) {}B(int aa, int bb) :A(aa), b(bb) {}~B() {}virtual void print(){A::print();cout << "B: " << b << endl;}virtual void printa(){A::printa();cout << "B: " << b << endl;}static void pringaStaic(){cout << "static function " << endl;}private:int b; };int main(void) {A a;B b;void (A:: * ptr)(int) = &A::setA; //ptr是成員函數的指針void (*sPf)(void); //靜態函數指針sPf = &B::pringaStaic; //指向靜態函數A* pa = &a;//對于非虛函數,返回其在內存的真實地址printf("A::set(): %p\n", &A::setA);//對于虛函數, 返回其在虛函數表的偏移位置printf("B::print(): %p\n", &A::print);printf("B::print(): %p\n", &A::printa);a.print();a.setA(10);a.print();a.setA(100);a.print();//對于指向類成員函數的函數指針,引用時必須傳入一個類對象的this指針,所以必須由類實體調用(pa->*ptr)(1000);a.print();(a.*ptr)(10000);a.print();//靜態函數指針可以直接用sPf();return 0; }總結
- 上一篇: Qt中消息的机制原理
- 下一篇: C++ 线程池的思想