[c++] 函数作为参数

2021-01-30 11:14

阅读:474

标签:错误   赋值   函数类型   编译错误   函数作参数   相同   def   code   out   

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

上述注释(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

但在我自己这在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 

值得注意的是,对成员函数指针赋值时,成员函数前必须加&。

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 

[c++] 函数作为参数

标签:错误   赋值   函数类型   编译错误   函数作参数   相同   def   code   out   

原文地址:https://www.cnblogs.com/drunknbeard/p/12820927.html


评论


亲,登录后才可以留言!