C++注意事項--02 函數指針用於帶默認參數的函數

一 引言:

        在前面文章(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皆不可行,不在此展開。

        其實吧,在使用中不可能出錯,因爲編譯期間會報錯的,此文章僅說明一下問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章