在C++編程的時候,有時候我在考慮,如果把一個函數能夠當作一個變量,被調用、傳遞就會方便很多,之前學習了lambda表達式,用lamda表達式會比較方便。下面可以介紹一種新的方法,函數指針。
函數指針用例
int add(int a,int b){ return a+b; } void Widget::on_pushButton_clicked() { int (*pfunc)(int a,int b); pfunc = add; qDebug()<<pfunc(1,2)<<endl; }
如上,通過一個簡單了例子,可以看到函數指針的聲明以及賦值、應用的過程。可以將例子變得復雜一點:
int add(int a,int b){ return a+b; } void Widget::on_pushButton_clicked() { QMap<QString,int(*)(int,int)> toTest; toTest["test"] = add; qDebug()<<toTest["test"](1,2)<<endl; }
如果想要add函數為類中的非靜態成員函數,代碼可以寫成:
widget.h
int add(int a,int b); QMap<QString,int(Widget::*)(int,int)> toTest;
widget.cpp
int Widget::add(int a,int b){ return a+b; } void Widget::on_pushButton_clicked() { toTest["test"] = add; qDebug()<<(this->*toTest["test"])(1,2)<<endl; }
如果add函數聲明為靜態成員函數,就方便多了。
widget.h
static int add(int a,int b);
widget.cpp
int Widget::add(int a,int b){ return a+b; } void Widget::on_pushButton_clicked() { QMap<QString,int(*)(int,int)> toTest; toTest["test"] = add;//用&add也行 qDebug()<<toTest["test"](1,2)<<endl; }
當我們把函數名作為一個右值使用時,此函數名會自動地轉化為指針,當然,也可用取地址符(兩者是等價的):
toTest["test"] = add; toTest["test"] = &add;