声明函数的引用:
int f( double ); - int (* const pf)(double) = f; // pf是指向函数f()的常量指针
- int (&rf)(double) = f; // rf是函数f()的引用
从编码实践角度来看,指向函数的常量指针和函数的引用并无很大不同。除了一点,那就是指针可以显式地使用反引用语法,而对引用是不能使用显式反引用语法的,除非它被隐式转换成指向函数的指针 。
a = pf( 12.3 ); // 直接用函数指针名调用函数 - a = (*pf)(12.3); // 使用反引用语法也是可以的a = rf( 12.3 ); // 通过引用调用函数
- a = f( 12.3 ); // 直接调用函数本身a = (*rf)(12.3); // 把引用(隐式)转换成指向函数的指针,再使用反引用语法
- a = (*f)(12.3); // 把函数本身(隐式)转换成指向函数的指针,再使用反引用语法
(注:此处六行代码主要想说明,C++的函数调用很灵活,无论是通过使用函数名本身、指向函数的指针还是函数的引用来调用函数,都既可以用名字本身,也可以使用反引用语法。尽管后两行在语法上其实是经过了一个隐式类型转换,因而会带来效率上的损失。)
这是《C++语言99个常见编程错误》错误5中的一段话。
说反引用可能有点莫名奇妙,其实它就是解引用,只是翻译过来不同罢了。
上面声明函数指针时,
int(* const pf)(double)易可为int(* const pf)(double) = &f; 此处的原因为:将一个函数的地址初始化或赋值给一个指向函数的指针时,无需显式地取得函数地址,编译器知道隐式地获得函数的地址,即在此种情况下,&操作符是可选的,通常省略不用。
然后对于引用的解引用,由编译器隐式转换成指向函数的指针,否则编译不通过。
当然要是真想编无聊的代码,后两句可以类似写成这样 a = (*****************rf)(12.3); 其中意思参考上面你应该懂的。 |