一 引言:
在前面文章(Qt學習記錄--05 函數指針以及類函數指針用於Qt信號槽)中簡要描述了函數指針的使用及在Qt信號槽的應用,本次主要說一下,它的某一方面的注意事項。
在聲明函數時,在特定場景下,我們會爲函數的某個(些)入參賦一個默認值,這樣在以後的使用中,可以少寫或者根本不寫傳參,這給我們帶來了便利,但它與函數指針的結合會有什麼樣的效果呢?本文將對此進行簡單講述。
二 詳解:
首先舉個栗子(^_^):
#include <iostream>
typedef int(*PFUNC)(int, int);
int Add(int a, int b = 10)
{
return (a + b);
}
int main()
{
PFUNC fun1 = Add;
std::cout << fun1(10, 10) << std::endl;
system("pause");
return 0;
}
上面的使用很正確,但是也失去了帶默認參數函數的優勢,但假如我們將函數指針的定義變爲:
typedef int(*PFUNC)(int, int = 10);
那麼在VS2015下會報如下的錯誤:
可以看到在聲明函數指針時,不可添加默認參數。
那麼,我們在調用時少傳參呢?即:
PFUNC fun1 = Add;
std::cout << fun1(10) << std::endl;
在VS2015下,會報如下錯誤:
所以,使用函數指針此路不通。這是 C++ 語言的限制:默認參數只能使用函數聲明時。當使用函數指針取其地址時,默認參數也是不可見的。
可能有人會問使用function是否可行呢?經測試這也是行不通的,使用std::function和boost::function皆不可行,不在此展開。
其實吧,在使用中不可能出錯,因爲編譯期間會報錯的,此文章僅說明一下問題。