[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);
原⽂链接:blog.csdn/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;
}
本例原⽂链接:blog.csdn/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;
}
原⽂链接:blog.csdn/luofengmacheng/article/details/19606851
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论