[c++] 函數作為參數


C++函數本身是可以作為參數傳入函數的。
1.函數作為形參的語法格式

函數類型 (*自定義變量名)(形參1,形參2,...) 

在這種情況下一定要加指針,加括號。
例1:

void foo(void (*func)(int),int j)
{
    func(j);
}

其中void (*func)(int)為傳入的函數形參。
2.傳入的實參的語法格式
a)

例2:

void printnumber(int j)
{
    cout<<"j="<<j<<" "<<endl;
}
int main()
{
    void (*func)(int i);
    func = printnumber;
    foo(func,1);//(1)
    foo(printnumber,1);//(2)
}

上述注釋(1),(2)都可,但(1)要要注意的是初始化等號兩邊類型參數必須完全相同,否則不能用=號復制。
b)
網上看到這種寫法:
例3:

typedef int (*func) (int,int);
//這樣func就可以代表一類函數;
//使用這個定義
void runfunc(func p,int a, int b)
{
	p(a,b);
}
void add(int a, int b)
{
	cout<<a+b<<endl;
}
//函數作參數
runfunc(add,1,2);
原文鏈接:https://blog.csdn.net/u010309553/article/details/52156300

但在我自己這在runfunc(add,1,2);這報錯了:

void add(int a, int b)
"void (*)(int a, int b)" 類型的實參與 "funct" 類型的形參不兼容

晚點再看看吧。
3.使用成員函數的指針作為參數
首先,成員函數是可以被指針調用的:
例4:

class A {
public:
    void fun(int a)
    {
        cout << a;
    }
};
 
int main()
{
    A a;
    void (A::*ptrfun)(int);
    ptrfun = &A::fun;
    (a.*ptrfun)(2);
 
    return 0;
}
本例原文鏈接:https://blog.csdn.net/luofengmacheng/article/details/19606851

值得注意的是,對成員函數指針賦值時,成員函數前必須加&。

1)在對普通函數指針進行賦值時,不用加&:pfun = print,但是,對成員函數指針進行賦值時,必須加&:ptrfun = &A::fun。這涉及到函數類型與函數指針類型,對於普通函數,當定義了一個函數指針,將函數名賦值給函數指針,函數類型會默認轉換成函數指針,因此pfun = print或者pfun = &print都是可行的,只是pfun = print中有一層默認的轉換。而對於成員函數,當定義了一個成員函數指針ptrfun,如果直接用A::fun進行賦值,編譯器會將它理解為A中的靜態成員,會產生編譯錯誤,所以,這里的&是必須的。不過,如果寫成這樣ptrfun = &(A::fun);也會發生編譯錯誤,因為,將A::fun作為一個整體,編譯器就會將fun理解為A中的靜態成員,所以,要將&A::fun作為一個整體,即使::的優先級較高。

(2)同樣,對於調用方式也有類似的不同。對於普通函數,(pfun)()和pfun()都是可以的。對於成員函數,只能是(a.ptrfun)()。

最后舉一個成員函數做形參的例子:
例5:

class A {
public:
    void fun(int a)
    {
        cout << a;
    }
};
 
void test(A x, void (A::*pfun)(int), int y)
{
    (x.*pfun)(y);
}
 
int main()
{
    void (A::*ptrfun)(int);
    ptrfun = &A::fun;
    A a;
    test(a, ptrfun, 3);
 
    return 0;
}
原文鏈接:https://blog.csdn.net/luofengmacheng/article/details/19606851


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM