zoukankan      html  css  js  c++  java
  • C++基础 学习笔记三:函数指针

    C++基础 学习笔记三:函数指针

    什么是函数指针

    函数指针是指向函数的指针变量。 因此“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。C/C++在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样,在这些概念上是大体一致的。函数指针有两个用途:调用函数和做函数的参数。

    注:函数指针和指针函数并非同等事物,指针函数指的是返回值是指针的函数

    函数指针的声明方法

    1. 普通函数指针

      返回值类型 ( * 指针变量名) ([形参列表]);

    2. 成员函数指针

      1. 静态成员函数指针

        返回值类型 (*指针变量名)([形参列表]);

      2. 成员函数指针

        返回值类型 (类名::*指针变量名)([形参列表]);

    函数指针的使用例子

    #include<iostream>
    
    using namespace std;
    
    class Calculator
    {
    	public:
    		Calculator(const double leftArg, const double rightArg, const char C_operator) : 
    		left(leftArg), right(rightArg), oper(C_operator)
    		{
    		}
    		double getResult()
    		{
    			switch(oper)
    			{
    				case '+':
    					return (this->*functionList1[0])(left,right);//成员函数指针数组的例子 
    					break;
    				case '-':
    					return calculate(sub);//成员函数指针作为参数的例子 
    					break;
    				case '*':
    					return functionList2[0](left,right);//静态成员函数指针数组的例子 
    					break;
    				case '/':
    					return DIV(left,right);//静态成员函数指针的例子(普通函数指针的用法和此处一样) 
    					break;
    				default:
    					return (this->*OPERATORERROR)();//成员函数指针的例子
    					break;
    			}
    			return 0;
    		}
    	private:
    		double calculate(double (Calculator::*functionSub)(const double, const double))
    		{
    			return (this->*functionSub)(left,right);
    		}
    		double add(const double leftArg, const double rightArg)
    		{
    			return leftArg+rightArg;
    		}
    		double sub(const double leftArg, const double rightArg)
    		{
    			return leftArg-rightArg;
    		}
    		static double mul(const double leftArg, const double rightArg)
    		{
    			return leftArg*rightArg;
    		}
    		static double div(const double leftArg, const double rightArg)
    		{
    			if(leftArg == 0)
    				return -1;
    			return leftArg/rightArg;
    		}
    		double operatorError()
    		{
    			cout << "operatorError" << endl;
    			return 0;
    		}
    	private:
    		double left = 0;
    		double right = 0;
    		char oper;
    		double (Calculator::*functionList1[1])(const double, const double) = {add};
    		double (*functionList2[1])(const double, const double) = {mul};
    		double (*DIV)(const double, const double) = &div;
    		double (Calculator::*OPERATORERROR)() = &operatorError;
    }; 
    
    int main()
    {
    	Calculator add(8,4,'+');
    	cout << add.getResult() << endl;
    	Calculator sub(8,4,'-');
    	cout << sub.getResult() << endl;
    	Calculator mul(8,4,'*');
    	cout << mul.getResult() << endl;
    	Calculator div(8,4,'/');
    	cout << div.getResult() << endl;
    	Calculator error(8,4,'.');
    	cout << error.getResult() << endl;
        return 0;
    }
    /* 运行结果为: 
    12
    4
    32
    2
    operatorError
    0
    
    --------------------------------
    Process exited after 0.09482 seconds with return value 0
    请按任意键继续. . .
    */ 
    
  • 相关阅读:
    Xcode-调试断点不能停在代码区终极解决方案
    iOS-修改Status Bar
    iOS-appStore发布流程
    iOS-Debug调试
    iOS-项目搭建
    iOS-UIButton-设置button标题和图片位置
    iOS-布局-Masonry-优先级
    intent 传参数
    五大布局
    execute、executeQuery和executeUpdate之间的区别
  • 原文地址:https://www.cnblogs.com/realZhaZhaHui/p/12741414.html
Copyright © 2011-2022 走看看