141. C++

函数

函数指针

  • 函数的地址是存储其机器语言代码的内存开始的地址

  • 好处:可在在不同的时间使用不同的函数(可以把函数当做参数传递)

  • 声明:

    1
    2
    3
    4
    // 函数原型
    double sum(double, double)
    // 函数指针声明
    double (*ptrSum)(double, double)

    注意:

    • 该语句声明了一个指针ptrSum,指向一个函数
    • double *ptrSum(double, double)不是函数指针,而是:声明了一个函数ptrSum,返回 double *类型
  • 用法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    // 声明power函数
    int power(int, int);
    // 声明函数指针
    int (*powerPtr)(int, int);
    // 让声明的函数指针指向函数,以便调用
    powerPtr = power;
    // 调用
    powerPtr(3, 4)
    (*powerPtr)(3, 4)
  • 应用

    • 题目

      用函数指针实现加减乘除

    • 代码

      • Caculator.h

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        20
        21
        22
        23
        24
        25
        26
        27
        28
        29
        30
        31
        32
        33
        34
        35
        36
        37
        38
        39
        40
        41
        42
        43
        44
        45
        46
        47
        48
        49
        50
        51
        52
        53
        54
        55
        56
        57
        58
        59
        60
        61
        62
        63
        64
        65
        66
        67
        68
        69
        70
        71
        /**
        * author Qeuroal
        * date 2021/5/19
        * description
        */
        #ifndef BLOG141_CACULATOR_H
        #define BLOG141_CACULATOR_H
        #include <iostream>
        using namespace std;

        // 自定义计算器,使用函数指针

        /**
        * 加法
        * @return
        */
        double addition(double, double);
        /**
        * 减法
        * @return
        */
        double subtraction(double, double);

        /**
        * 乘法
        * @return
        */
        double multiplication(double, double);

        /**
        * 除法
        * @return
        */
        double division(double, double);

        /**
        * 打印计算结果
        * param double (*)(double , double ) 函数指针
        */
        void printResult(double (*)(double , double ), double, double);

        void printResult(double (*calcPtr)(double, double), double num1, double num2) {
        // 调用函数,打印结果
        double result = calcPtr(num1, num2);
        cout << "运算结果为:" << result << endl;
        return;
        }

        double addition(double num1, double num2) {
        return num1 + num2;
        }

        double subtraction(double num1, double num2) {
        return num1 - num2;
        }

        double multiplication(double num1, double num2) {
        return num1 * num2;
        }

        double division(double num1, double num2) {
        if (num2 == 0) {
        cout << "除数不能为0!!" << endl;
        return 0;
        }
        return num1 / num2;
        }



        #endif //BLOG141_CACULATOR_H
      • FuncPtr.cpp

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        20
        21
        22
        23
        24
        25
        26
        27
        28
        29
        30
        31
        32
        33
        34
        35
        36
        37
        /**
        * author Qeuroal
        * date 2021/5/19
        * description
        */
        #include <iostream>
        #include "Caculator.h"

        using namespace std;

        int main() {
        // 定义函数指针
        double (*calcPtr)(double, double) = nullptr;
        // 定义函数指针数组
        double (*calcPtrArray[])(double, double) = {};
        cout << "请输入两个操作数:";
        double num1, num2;
        cin >> num1 >> num2;
        cout << "请输入运算符:";
        char op;
        cin >> op;
        switch (op) {
        case '+':
        calcPtr = addition;
        break;
        case '-':
        calcPtr = subtraction;
        break;
        case '*':
        calcPtr = multiplication;
        break;
        case '/':
        calcPtr = division;
        break;
        }
        printResult(calcPtr, num1, num2);
        }
  • 注意

    • 要用函数指针的话,先定义函数,再定义函数指针;

    • C11 中可以使用 auto funcPtr = addition; 自动推断类型(自动类型推断需要确保变量的类型与初值类型一致);

    • 使用auto时,需要初始化,否则会报错;

    • 可以使用 typedef 简化声明:

      1
      2
      3
      typedef double (*funcPtr)(double, double);
      // 此时funcPtr是一个新的类型,而不是一个函数指针,真正的函数指针是calcPtr
      funcPtr = calcPtr;

面向对象

注意点。

  • 类一般是在头文件定义
  • .h文件 声明类的结构,.cpp文件实现类的成员函数

实例化方法(以无参构造为例)

假设定义了 Person 类。

  • 省略了默认构造:Person person; (在栈内存中直接分配空间)

  • 标准写法:Person person(); (在栈内存中直接分配空间)

  • 指针写法:Person *person = new Person(); (在堆内存分配空间,并用指针 person 指向该内存空间)

  • 如果构造函数中只有一个是带唯一的参数,如下所示:

    • 1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      class Person {

      public:
      Person(int age) {
      this->age = age;
      }

      Person(string name, int age) {
      this->name = name;
      this->age = age;
      }
      private:
      string name;
      int age;
      };
    • 实例化

      1
      Person person =20;

构造函数

  • 正常写法(略)

  • 简化写法:初始化参数列表写法

    1
    Person::Person(string name, int age) : name(name), age(age) {}