c++ 函数指针

声明

int (*pf)( const string &, const string & ); // 正确

如上,声明了一个函数指针,注意的是,解引用操作符* 应与返回类型关联所以在这种情况下是与类型名int 关联而不是pf 要想让解引用操作符与pf 关联,所以括号是必需的

初始化、赋值和调用

  • 函数指针可以用0 来初始化或赋值以表示该指针不指向任何函数
  • 直接去想要调用的函数名,如add,注意,这里没有括号。
  • 将取地址操作符作用在函数名上也能产生指向该函数类型的指针
#include <string>
int lexicoCompare( const string &s1, const string &s2 ) {
	return s1.compare(s2);
}

int (*pfi)( const string &, const string & ) = lexicoCompare;//初始化
pfi = lexicoCompare;//赋值

注意问题

在指向函数类型的指针之间不存在隐式类型转。也就是,只有当赋值操作符左边指针的参数表和返回类型与右边函数或指针的参数表和返回类型完全匹配时初始化和赋值才是正确的如果不匹配则将产生编译错误消息。

demo

#include<iostream>
 
using namespace std;
void estimate(int lines, double (*pf)(int));
double rick(int lines);
 
int main(void) {
	int code;
	cout << "Enter the money:";
	cin >> code;
	estimate(code, rick/*计算lines时间的函数*/);
	return 0;
}
 
void estimate(int lines, double (*pf)(int)/*指向执行函数的地址*/) {
	cout << "Lines code will take time:" << (*pf)(lines) << endl;
}
 
double rick(int lines) {
	return lines*0.05;
}
#include <iostream>
#include<vector>

using namespace std;

int func1(int a, int b) {
    return a + b;
}
int func2(int a, int b) {
    return a - b;
}
int func3(int a, int b) {
    return a * b;
}
int func4(int a, int b) {
    return a / b;
}

void Compute(int a, int b, int(*p)(int, int)) {
    cout << p(a, b) << endl;
}
int main() {
    int i = 5, j = 10;
    // decltype,在C++中,作为操作符,用于查询表达式的数据类型。decltype在C++11标准制定时引入,主要是为泛型编程而设计
    decltype(func1) *p1 = func1, *p2 = func2, *p3 = func3, *p4 = func4;
    vector<decltype(func1)*> vF = { p1,p2,p3,p4 };
    for (auto p : vF)
    {
        Compute(i, j, p);
    }
    system("pause");
    return 0;
}

类成员函数,定义函数指针

指针变量名 = &类名::成员函数名;

定义的函数指针变量,指向了一个类中的一个函数。但是,当一个类实例化为多个对象的时候,调用函数指针的时候,就必须指定哪一个对象。

#include <stdio.h>
#include <string>
#include <iostream>
using namespace std;

class student{
    char name[32];
    char addr[32];
    long long number;
    
    student(char *pn,char *pa,long long n){
        strcpy(name,pn);
        strcpy(addr,pa);
        number = n;
    }
    void print(){
        cout <<"name = "<<name<<endl;
        cout <<"addr = "<<addr<<endl;
        cout <<"number = "<<number<<endl;
    }
}

void (student::*pfunc)(); // 定义student类中的一个函数指针

int main(void){
    student stud("sss","asss@xx.com",221333);
    pfunc = &student::print;
    (stud.*pfunc)();// 通过函数指针调用stud的成员函数
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值