C++ Primer 6.7节练习

 返回指向函数的指针,该小节初开始难以从字面上理解该节内容的意义。

 反复斟酌后,意识到其实这是一个普通的函数,该函数的返回类型是指针,指针却是指向函数类型的。所以调用该函数后得到的返回指针,指向了该类函数类型。

 当然,最简单的方法是使用类型别名~

  

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

其中我们使用类型别名将F定义成函数类型,将PF定义成指向函数类型的指针。必须时刻注意的是,和函数类型的形参不同,函数类型不会自动地转换成指针,这需要我们显示的将返回类型指定为指针。

当然也可以如下形式去定义:

  

int (*f1())(int,int);

当然也可以使用尾置返回类型的方式

最后放上本6.7节的习题

练习6.54:编写函数的声明,令其接收两个int形参并且返回类型也是int;然后声明一个vector对象,令其元素是指向该函数的指针。

练习 6.55:编写4个函数,分别对两个int值执行加、减、乘、除运算;在上一题创建的vector对象中保存这些函数的指针。

练习 6.56:调用上述vector对象的每个元素并输出其结果。

代码如下:

#include "stdafx.h"
#include <iostream>
#include <vector>

//练习6.54:编写函数的声明,令其接收两个int形参并且返回类型也是int;然后声明一个vector对象,令其元素是指向该函数的指针。
//
//练习 6.55:编写4个函数,分别对两个int值执行加、减、乘、除运算;在上一题创建的vector对象中保存这些函数的指针。
//
//练习 6.56:调用上述vector对象的每个元素并输出其结果。

using namespace std;



//练习 6.56:调用上述vector对象的每个元素并输出其结果。

int func(int, int);

typedef int(*pc)(int, int);////使用类型别名的方法

vector<int(*)(int, int)> vec1; ////声明(原始)1:按内向外的顺序阅读,定义了该类型函数指针的vector对象。
vector<pc> vec2;            




//练习 6.55:编写4个函数,分别对两个int值执行加、减、乘、除运算;在上一题创建的vector对象中保存这些函数的指针。
int Add(int a, int b)
{
    return a + b;
}

int Sub(int a, int b)
{
    return a - b;
}

int Multiply(int a, int b)
{
    return a * b;
}

int Divide(int a, int b)
{
    if (b != 0)
        return a / b;
}
/////第三种方法:利用返回指向函数的指针
int(*v1())(int, int) ////////该方法定义一个函数,函数将返回一个指向该函数类型的函数指针
{                       //可以直接解引用该方法进行运算
    return Sub;        
}

int(*v2())(int, int)
{
    return Add;
}
//.............

//练习 6.56:调用上述vector对象的每个元素并输出其结果。
int main()
{



    int x(520), y(1314);
    
    cout << (((*v1)()) (x, y)) << endl; ////可以看到该方法多复杂,但是返回的指针在其他地方有用处
    cout << (((*v2)()) (x, y)) << endl;


    int(*f1)(int, int) = Add;   ///第一种方法,声明函数指针,并且指向函数
    int(*f2)(int, int) = Sub;
    int(*f3)(int, int) = Multiply;
    int(*f4)(int, int) = Divide;


    vec1.push_back(f1);         ///将指针插入到容器中
    vec1.push_back(f2);
    vec1.push_back(f3);
    vec1.push_back(f4);

    pc p1 = Add;          ///第二种方法,使用函数类型类型别名,去声明函数指针,并且指向对应的函数
    pc p2 = Sub;          //果然是使用类型别名的方法最舒服~~~
    pc p3 = Multiply;
    pc p4 = Divide;

    vec2.push_back(p1);
    vec2.push_back(p2);
    vec2.push_back(p3);
    vec2.push_back(p4);

    for (auto c : vec1)
    {
        cout <<"输出函数指针计算后的结果"<< (c(x,y)) << endl;
    }
    return 0;

    for (auto c : vec2)
    {
        cout << "输出函数指针计算后的结果" << (c(x, y)) << endl;
    }
    return 0;

}

猜你喜欢

转载自www.cnblogs.com/Fengyuyang/p/9091020.html
今日推荐