小记_函数指针别名与作为返回值使用_C++Primer6.7

环境

Dev-C++ 5.11 C++14

使用using创建三种别名

using F=int(int*,int);
using PF=int(*)(int*,int);
using PF2=int*(int*,int);

据推测

F为返回int类型,形参列表为(int*,int)的函数类型

PF为返回int类型,形参列表为(int*,int)的函数指针类型

PF2为返回int*类型,形参列表为(int*,int)的函数类型

定义两个函数

int* bbb(int *a,int b)
{
    cout<<"bbb"<<endl;
    return a;
}

int aaa(int *a,int b)
{
    cout<<"aaa"<<endl;
    return *a+b;
}

实验1:

PF pf1(int a)
{
    cout<<"pf1"<<endl;
    return nullptr;
}
PF pf2(aaa);//PF f1(bbb);
PF pf3(int a);

int main()
{
    pf1(10);//output pf1
    
    int a=10;
    cout<<pf2(&a,a)<<endl;//output aaa /n 20
    
    pf3(10);//output pf3
}
PF pf3(int a)
{
    cout<<"pf3"<<endl;
    return nullptr;
}

推测PF为返回int类型,形参列表为(int*,int)的函数指针类型,在pf1作为返回类型,pf1为直接定义,在pf2作为数据类型,表面了pf2是一个函数指针,指向函数aaa,且若指向bbb则报错,在pf3同样作为返回类型,分为声明和定义。

pf1、pf3皆为返回一个[返回int类型,形参列表为(int*,int)的函数指针]的,形参列表为(int)的函数~~(纯纯的套娃)~~

实验2:

PF pf001(int)
{
    cout<<"pf001"<<endl;
    return nullptr;
}
//PF* pf101(pf001);
//[Error] cannot convert 'int (* (*)(int))(int*, int)' to 'int (**)(int*, int)' in initialization

//PF* pf101(int) = pf001;
//[Error] invalid pure specifier (only '= 0' is allowed) before ';' token 
//[Error] function 'int (** pf101(int))(int*, int)' is initialized like a variable
int main()
{
    pf001(10);
}

我无法正确的创建一个指向PF返回值,形参列表(int)的函数指针~~(套娃失败)~~,也许需要使用括号获得更正确的结合顺序,总之创建一个指向[返回值为函数指针的函数]的函数指针是一件很不方便的事

实验3:

F f3(int a)
{
    cout<<"f3"<<endl;
    return aaa;
}
int main()
{
    f3(10);//[Error] 'f3' declared as function returning a function
}

试图让f3返回一个函数,报错(错误在f3定义即发生,并没有到执行f3(10)😉

F* f4(int a)
{
    cout<<"f4"<<endl;
    return aaa;
}
int main()
{
    f4(10);
}

手动修改返回值为指针类型,成功

实验4:

int* bbb(int *a,int b)
{
    cout<<"bbb"<<endl;
    return a;
}

int aaa(int *a,int b)
{
    cout<<"aaa"<<endl;
    return *a+b;
}
//PF2 pf21(aaa);
//PF2 pf22(bbb);
//[Error] function 'int* pf21(int*, int)' is initialized like a variable
int main()
{
    
}

pf2和pf22均报错

PF pf0;
PF2 pf20;
decltype(pf0) pf1(aaa);
decltype(pf20) pf21(aaa);//报错

PF不等价PF2

int* bbb(int *a,int b)
{
    cout<<"bbb"<<endl;
    return a;
}

int aaa(int *a,int b)
{
    cout<<"aaa"<<endl;
    return *a+b;
}
//PF2* pf22(bbb);
PF2* pf23(int a)
{
    cout<<"pf23 "<<a<<endl;
    return bbb;
}

int main()
{
    pf23(10);//output pf23 10
}

PF2近似F,一个返回[返回值int的函数],一个返回[返回值int*的函数],可以添加一个*号返回函数指针

===============================================================

实在是太绕了,受不了受不了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值