簡體   English   中英

指向函數的指針 (C++)

[英]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 (函數的第二個參數)。

同樣,在這兩種情況下都會發生從intdouble的轉換。 它只是在初始化局部變量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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM