普通函数指针、成员变量指针与成员函数指针

(1)普通函数指针

让我们从普通函数指针开端。,朝着函数指针,它们常常与指针函数困惑。,这么它们暗中有什么分别呢?

1、指针函数

 int* fint int b)  //函数名为f,使恢复原状值为int典型的指针

复杂来说,它是削尖行使方使恢复原状地址的指针函数。,用于必要地址的时机。。

2、函数指针

int f)(int) a, int b); // 述说函数指针

实际的,函数指针的函数名是指针。,执意说,函数解释的后面有指针典型。*”。

函数指针(函数地址)的估计价值。即f = &Function

函数指针行使。x = (*f)(参量);

3、typedef函数指针

1)了解

    typedef void (*pHello)();

int main(int argc, char *argv[])

{

    //int (FABC) AXC)

    //fAbc=&abc;

    //cout<<(*fAbc)(1)<

    void PF)

    pf = &hello;

    PF)

    //pf();

    pHello p = &hello;

    (*p)();

    return 0;

}

connect在指定遗传密码中,应用了typedef void (*pHello)();这刻薄的界说函数指针典型。,尔后,它被随处应用。p这都是一种典型。,代表void(*)()即将到来的函数指针。pHello q当量的于void*q();

再举一点钟范例:typedef int PF)(int);指导性的使恢复原状一点钟值。int,参量为int的函数。

实际的,在这边typedef是界说一种新的典型。,界说了phello典型,即将到来的典型是削尖函数的指针。,晚年的你可以用它。intchar同卵双胞用法phello了。竟然这种使格式化的界说,可以移除typedef别号是原始变量的典型。。拿 … 来说:void (*)()

(2)应用:

    void PF)

    pf = &hello;

    PF)

或许pHello p = &hello;

(*p)();

在这边,假定pf=&hello顶替hello,这将是不义行为的,产出效应拿住不变的。,因函数名就代表函数的首地址。

(二)成员变量指针

1、削尖成员变量的指针可以分为非动态成员指针和。

类成员变量指针,确实,它故障真正意思上的指针。,执意说,它缺席削尖内存打中地址。,它是成员变量和女朋友指针的偏移量。。偏移量只附加到一点钟指定的女朋友上。,削尖女朋友成员变量的指定地址。。

削尖动态成员的指针,它的值削尖内存的录音区域打中地址。,这是真正意思上的指针。,因动态成员属于类功能域。,不属于女朋友。

2、界说与述说

述说:typedef int A::* MemberPointer; //在意添加区名。,MemberPointerint *A典型的别号

界说:MemberPointer pV;均势于int A::* pV;

例:

class A{

    public:

    int x;

};

   int main(int argc, char *argv[])

{

MemberPointer pV;//成员变量指针义,均势于int A::* pV;

    pV = &A::x ;

    A a;

    a .* pV=1;//均势于

    cout << &a ->* pV << endl;

    return 0;

}

(三)成员函数指针

1、了解

削尖非动态成员函数的指针,它的值削尖内存地址。。即使指针不克不及目前的行使。,它必要绑定到女朋友才干被行使。。

果真成员函数指针与普通函数指针的分别执意成员函数指针的述说要增加类的限度局限,当函数指针为产生时,编纂者将添加函数行使。this指针,相应地类成员函数不克不及独立行使。,与类女朋友协调。拿 … 来说:typedef void (Child::*ChildMemberFunctionPointer)();

2、应用

int main(int argc, char *argv[])

{

    Person someone;

    Child xiaoming;

    PersonMemberFunctionPointer pp;

    pp = &Person::说喂;

    (某某东西) .* 聚丙烯)

    (xiaoming.*聚丙烯)

    //pp=&Child::说喂;(无法运转),使不得不替换

    ChildMemberFunctionPointer cp = &Child::说喂;

    (xiaoming.*cp)();

    runfuncName(&xiaoming,聚丙烯)

    PersonMemberFunctionPointer pp2 = &Person::sayName;

    (某某东西).*pp2)();

    (xiaoming.*pp2)();//麝香公共的承继。,单独的威望

    return 0;

}

内容 pp = &Person::说喂;(某某东西) .* 聚丙烯)相当于 (&someone ->* 聚丙烯)它也相当于 ();

(四)总结:

1成员函数指针与普通函数指针的分别

成员函数指针的述说要增加类的限度局限,当函数指针为产生时,编纂者将添加函数行使。this指针,相应地类成员函数不克不及独立行使。,与类女朋友协调。

2pp = &Person::说喂;在类中行使非动态成员函数时,为什么应用类名?::函数名,而故障范例名。::函数名?

因类名是域的构想。,变量名故障。,应用雷明彩,您可以找到函数指定遗传密码的臀部。,行使此函数。

3::为功能域运算符,内容::x代表全球搜索。

发表评论

电子邮件地址不会被公开。 必填项已用*标注