一 引言:
在前面文章(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皆不可行,不在此展开。
其实吧,在使用中不可能出错,因为编译期间会报错的,此文章仅说明一下问题。