1

函数指针

指向函数的指针变量,即重点是一个指针。一种特殊的指针,它指向函数的入口;
要声明指向特定类型的函数指针,可以首先编写这个函数的原型,然后用(*p)来替换函数名,这样p就是这类函数的指针。

//格式:类型说明符 (*函数名)(参数)
 int (*f) (int x); 

指向函数的指针包含了函数的地址,可以通过它来调用函数,其实这里不能称为函数名,应该叫做指针的变量名。这个特殊的指针指向一个返回整型值的函数实现地址。指针的声明笔削和它指向函数的声明保持一致。

#include <iostream>

/*
* 定义一个函数指针p,只能指向返回值为int,形参为两个int的函数
*/
int(*p)(int, int);

/*
* 求最大值
* 返回值是int类型,返回两个整数中较大的一个
*/
int max(int a, int b) {
    return a > b ? a : b;
}

/*
* 求最小值
* 返回值是int类型,返回两个整数中较小的一个
*/
int min(int a, int b) {
    return a < b ? a : b;
}

int main(){
    p = max; // 函数指针f指向求最大值的函数max  
    int c = (*p)(1, 2);
    std::cout << c << std::endl;

    //p = min; // 函数指针f指向求最小值的函数min  
    //c = (*f)(1, 2);
    //std::cout << c << std::endl;
}

指针函数

就是指针的函数,表示是一个函数,函数返回类型是某一类型的指针
返回指针的函数,一个函数,它的返回值是指针;

//格式:类型标识符 *函数名(参数表)
int  *f(x,y);
#include <iostream>

/*
* 指针函数的定义
* 返回值是指针类型int *
*/
int *f(int a, int b) {
    int *p = (int *)malloc(sizeof(int));
    memset(p, 0, sizeof(int));
    *p = a + b;
    return p;
}

int main(){
    int *p1 = NULL;
    p1 = f(1, 2);

    std::cout << *p1 << std::endl;
}

回调函数

通过传参的形式将该函数的地址传递给其他函数,然后在其他函数中通过函数指针调用该函数。在其他函数中通过函数指针调用该函数的过程称为回调,而作为被调用的该函数则被称为回调函数。

#pragma once
#include<iostream>
using namespace std;
void Func(int(*callbackfun)(int, int), int a, int b)
{
    cout << callbackfun(a, b) << endl;
}

int test(int a, int b)
{
    return a + b;
}
void main()
{
    Func(test, 1, 2);
}
typedef 返回值类型 (*指针名) (参数列表)
#pragma once
#include<iostream>
using namespace std;

typedef int(*CALLBACKFUN)(int a, int b);

void Func(CALLBACKFUN call, int a, int b)
{
    cout << call(a, b) << endl;
}

int testCallbackFun(int a, int b)
{
    return a + b;
}
void main()
{
    Func(testCallbackFun, 1, 2);
}

注意:回调函数要么是全局函数,要么是静态函数!


关于 this指针

this 是 C++ 中的一个关键字,也是一个 const 指针,它指向当前对象,通过它可以访问当前对象的所有成员。

当前对象指正在使用的对象。

  • this 是 const 指针,它的值是不能被修改的,一切企图修改该指针的操作,如赋值、递增、递减等都是不允许的。
  • this 只能在成员函数内部使用,用在其他地方没有意义,也是非法的。
  • 只有当对象被创建后 this 才有意义,因此不能在 static 成员函数中使用。

this 实际上是成员函数的一个形参,在调用成员函数时将对象的地址作为实参传递给 this。不过 this 这个形参是隐式的,它并不出现在代码中,而是在编译阶段由编译器默默地将它添加到参数列表中。

this 作为隐式形参,本质上是成员函数的局部变量,所以只能用在成员函数的内部,并且只有在通过对象调用成员函数时才给 this 赋值。

普通的C++成员函数都隐含一个传递函数作为参数,即this指针,C++通过向其他成员函数传递一个指向自身的指针来实现程序函数访问C++数据成员。

成员函数最终被编译成与对象无关的普通函数,除了成员变量,会丢失所有信息,所以编译时要在成员函数中添加一个额外的参数,把当前对象的首地址传入,以此来关联成员函数和成员变量。这个额外的参数,实际上就是 this,它是成员函数和成员变量关联的桥梁。


为了实现回调,需要把this指针给转换掉!为了在该函数中可以直接操作该类中的成员,我们必须保留this指针!因此在类封装回调函数必须是静态函数

在类封装回调函数:
a.回调函数只能是全局的或是静态的。
b.全局函数会破坏类的封装性,故不予采用。
c.静态函数只能访问类的静态成员,不能访问类中非静态成员


Simple
10 声望4 粉丝