函数指针和函数引用作为函数的参数。感觉比较离谱
-
作用基本相同,唯一不同的是函数指针的引用作为参数时,无法使用函数名作为参数传入,此时需要定义为const
-
python中也有函数作为参数的概念,在Java中可以使用接口和匿名内部类的方式来实现。不过C++中的语法还是太离谱了,很多种方式都可以。
-
typedef decltype(funName) newName:提取funName函数的类型,定义函数类型为新的名称newName
-
疯了!下面的代码除了注释的部分,其他都没问题,请自行理解
。
void testDefault(long i) {
cout << i << endl;
}
// 以下几种定义方式相同,可以省略指针符号*
void fun1(long i, void (*fp) (long)) {
// 以下两种调用方式相同,可以省略解引用符号*
(*fp)(i);
fp(i);
}
void fun2(long i, void fp(long)) {
// 以下两种调用方式相同,可以省略解引用符号*
(*fp)(i);
fp(i);
}
// 使用类型别名,以下方式相同,函数名本身就被编译器解析为指针
typedef void (*Funcp)(long);
typedef void Func(long);
typedef decltype(testDefault) Func;
void fun3(long i, Funcp fp) {
// 以下两种调用方式相同,可以省略解引用符号*
(*fp)(i);
fp(i);
}
void fun4(long i, Funcp& fp) {
// 以下两种调用方式相同,可以省略解引用符号*
(*fp)(i);
fp(i);
}
void fun5(long i, const Funcp& fp) {
// 以下两种调用方式相同,可以省略解引用符号*
(*fp)(i);
fp(i);
}
void fun6(long i, Func fp) {
// 以下两种调用方式相同,可以省略解引用符号*
(*fp)(i);
fp(i);
}
void fun7(long i, Func& fp) {
// 以下两种调用方式相同,可以省略解引用符号*
(*fp)(i);
fp(i);
}
void fun8(long i, Func* fp) {
// 以下两种调用方式相同,可以省略解引用符号*
(*fp)(i);
fp(i);
}
Func& fun9() {
return testDefault;
// return &testDefault; 报错
}
Func* fun10() {
return testDefault;
return &testDefault;
}
Funcp fun11() {
return testDefault;
return &testDefault;
}
Funcp& fun12() {
Funcp f = testDefault;
return f;
}
int main() {
// 以下两种调用方式相同,可以省略去地址符号&
fun1(10, testDefault);
fun1(10, &testDefault);
fun2(10, testDefault);
fun2(10, &testDefault);
fun3(10, testDefault);
fun3(10, &testDefault);
Funcp f = testDefault;
Funcp& ref = f;
fun4(10, f);
fun4(10, ref);
//fun4(10, testDefault); 报错,无法使用字面量初始化一个引用
//fun4(10, &testDefault); 报错,无法使用字面量初始化一个引用
fun5(10, &testDefault);
fun5(10, testDefault);
fun6(10, &testDefault);
fun6(10, testDefault);
fun7(10, testDefault);
fun8(10, &testDefault);
fun8(10, testDefault);
fun1(10, fun9());
fun1(10, fun10());
fun1(10, fun11());
fun1(10, fun12());
fun2(10, fun9());
fun3(10, fun10());
// fun4(10, fun11()); 报错,字面量无法赋值引用变量
fun5(10, fun12());
fun4(10, fun12());
}
- 函数指针作为返回类型:直接使用函数名是不可以的,必须使用函数指针或函数引用才可以。
- 综上所示,函数名作和数组一样。在直接使用的时候可以当做一个指针,但本身并不是指针。并且在作为函数参数传入时,会退化为一个普通指针。
- 疯了疯了…