首先看了常用的寫法:
int fi(char){return 1;}int main(){int (*pf)(char)=fi;//以下兩種函數調用方式,沒有區別pf('a');//ok(*pf)('a');//okreturn 0;}
是的,你可能就此以為函數指標在調用的時候,是否解引用都無所謂了吧?我跟你想得一樣,是的,這是對的,但是注意我前面的用詞“函數指標在調用的時候,是否解引用都無所謂”,那麼還可能在什麼情況下使用函數指標呢?沒錯,就是“使用模板傳遞函數類型”的時候!
來看下面一個例子:
template<typename T>class C{public:C(T _t){_t('a');//ok(*_t)('a');//okT *t1=_t;//okt1=_t;//(*t1)=_t;//compile error!assignment of read-only location//T t2=_t;//compile error!variable 't2' has function type}};int fi(char){return 1;}int main(){C<int(char)> c(fi);//使用模板傳遞函數類型return 0;}
int(char)是使用模板傳遞函數類型,c(fi)給C的建構函式傳遞函數指標fi,對fi的調用,可以使用_t('a')和(*_t)('a')兩種方式(當然,你也可以在main函數中使用fi('a')和(*fi)('a')調用函數fi),但是對於int(char)類型的變數t2,卻無法複製構造,只能使用指標賦值方式。
在對int(char)函數類型變數賦值時,它表現得像是一個函數常量(就像函數名f1一樣),而如果對其指標的引用賦值時,它表現得像typedef int(*const constPF)(char)一樣。所以,它更像是一個“constructor、copy constructor和operator=”都為private的class,即無法建立它的執行個體、無法對它的執行個體初始化或賦值。只能對它的指標進行初始化和賦值然後使用。