[英]Pointers to Functions (C++)
我正在學習 C++ 教程。 我無法理解這個關於函數指針的示例。 這里是:-
// pointer to functions
#include <iostream>
using namespace std;
int addition (int a, int b)
{ return (a+b); }
int subtraction (int a, int b)
{ return (a-b); }
int operation (int x, int y, int (*functocall)(int,int))
{
int g;
g = (*functocall)(x,y);
return (g);
}
int main ()
{
int m,n;
int (*minus)(int,int) = subtraction;
m = operation (7, 5, addition);
n = operation (20, m, minus);
cout <<n;
return 0;
}
行“ m = operation (7, 5, addition);
”和“ n = operation (20, m, minus);
”的處理方式相同,但是雖然減號已聲明為指向 function 的指針,但加法沒有'噸。 那么,它們是如何以相同的方式工作的呢?
Using a function name as an argument parameter in a function call, or on the right-hand side of the assignment operator in C/C++, causes a conversion to a function pointer to the original function.
因此,例如,如果您有 function 之類的
void my_function(int a, int b);
如果您使用賦值運算符右側的標識符my_function
,如下所示:
void (*my_function_ptr)(int, int) = my_function;
然后my_function
從 function my_function_ptr
隱式轉換為 function 類型的指針void (*)(int, int)
,因此它指向 myfunction my_function
將my_function
傳遞給另一個 function 時也會發生相同的情況,例如:
void another_function(int, void (*)(int, int));
another_function(5, my_function);
在調用another_function()
時,標識符my_function
再次轉換為指向原始 function 的指針。
最后,請記住,僅當您簡單地將標識符名稱傳遞給 function 參數或將其放在賦值運算符的右側時,才會發生這種情況。 使用()
符號和可選參數列表(即my_function(5, 6)
)添加 function 調用將評估 function,不會導致轉換為 ZC1C425268E68385D1AB507C 指針。
addition
的類型是int (&)(int,int)
,可以衰減成與operation
函數第三個參數相同的int (*)(int,int)
類型的指針。 因此,您可以將addition
作為第三個參數傳遞給 function operation
。
subtraction
的類型也與addition
相同。 在您的代碼中, subtraction
地址首先存儲為兼容類型的局部變量,然后將該變量作為參數傳遞給operation
function。
在addition
的情況下,它的地址不會存儲為局部變量,而是按原樣傳遞給operation
。 它直接用函數的地址初始化函數的第三個參數,而不使用任何局部變量。
在這兩種情況下都會發生從int (&)(int,int)
到int (*)(int,int)
的轉換。 只是使用substration
,在初始化局部變量時發生轉換,而使用addition
,在初始化 function 參數時發生轉換。
一個類比是這樣的:
void f(double a, double b) {}
int main()
{
double x = 100;//first store 100 in a local variable
f(x, 100); //pass the local variable as first arg,
//and pass 100 as second arg without using any local variable.
}
注意100
的類型是int
,因此它首先轉換為double
類型,然后將其存儲為局部變量x
,然后將其作為第一個參數傳遞給 function f
。 第二個參數100
直接傳遞給 function,所以即使現在它首先轉換為double
然后初始化b
(函數的第二個參數)。
同樣,在這兩種情況下都會發生從int
到double
的轉換。 它只是在初始化局部變量x
時發生第一個參數轉換,而在初始化 function 的第二個參數時發生第二個參數轉換。
C 中的 function 的名稱被解析為其地址。 所以這有效:
int (*minus)(int,int) = subtraction;
兩種解決方案都有效:“操作”的第三個參數必須是 function 指針。
請注意,與號是可選的:
m = operation (7, 5, &addition);
也有效。
通過將“addition”傳遞給 operation(),您實際上是將其分配給“functocall”。 這與將“減法”分配給“減法”完全相同。 它們以相同的方式工作,因為它們是相同的。
真正的問題是,為什么你不需要一個 & 來獲取函數的地址?
ps 除了無償使用 iostream、namespace 和 cout,這實際上是一個 C 教程。 正確的?
C++ 提供隱式函數到指針的轉換(參見 C++ 2003 標准中的 4.3)。 在您的示例中,它既用於將subtraction
minus
也用於將addition
轉換為operation
接受的參數類型。 所以本質上這兩個調用都是以相同的方式完成的,只是在一種情況下,您顯式地創建了一個指向函數類型的中間變量。 在這兩種情況下,優化編譯器都會簡單地將相應的 function 的地址傳遞給operation
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.