服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C++指向类成员的指针详解

C++指向类成员的指针详解

2022-01-06 14:04weixin_41914179 C/C++

指向类成员的指针总的来讲可以分为两大类四小类(指向数据成员还是成员函数,指向普通成员还是静态成员),希望本片文章能给你带来帮助

序言:在C++中,可以定义一个指针,使其指向类成员函数或或成员函数,然后通过指针来访问类的成员,这包括指向属性成员的指针和指向成员函数的指针。

一.指向普通变量和函数的指针

指向普通变量的指针

?
1
2
int a=100;
int *p = &a;

指向函数的指针(即函数指针)

?
1
int(*p)(int, int);

这条语句的理解:定义了一个指向函数的指针变量p,首先它是一个指针变量(*p),其次前面的int表示指针变量可以指向返回类型为int型的函数,后面括号中的两个int表示这个指针变量可以指向两个参数都是int型的函数。所以合起来的意思就是:定义了一个指针变量p,该指针变量可以指向返回值类型为int型,且有两个整形参数的函数,p的类型为int(*)(int, int)

函数指针的定义方式为:

?
1
函数返回值类型 (* 指针变量名) (函数参数列表);

示例

?
1
2
3
int Func(int x);   /*声明一个函数*/
int (*p) (int x);  /*定义一个函数指针*/
p = Func;          /*将Func函数的首地址赋给指针变量p*/

二.指向类成员的指针

1.指向类数据成员的指针

?
1
2
3
4
5
6
//定义和赋值(和类相关)
数据类型 类名:: *指针名 = &类名::成员名
//使用(和对象相关)
//由于类不是运行时 存在的对象。因此,在使用这类指针时,需要首先指定类的一个对象,然后,通过对象来引用指针所指向的成员。
类对象名.*指向非静态数据成员的指针
类对象指针->*指向非静态数据成员的指针

2.指向类成员函数的指针

?
1
2
3
4
5
6
//定义和赋值(和类相关)
函数返回类型名 (类名::*函数指针名)(参数列表) = &类名::成员函数名
//使用(和对象相关)
//由于类不是运行时存在的对象。因此,在使用这类指针时,需要首先指定类的一个对象,然后,通过对象来引用指针所指向的成员。
(类对象名.*指向非静态成员函数的指针)(参数列表)
(类对象指针->*指向非静态成员函数的指针)(参数列表)

示例

?
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
class Stu
{
public:
    Stu(string sn,int ia):
        name(sn),age(ia)
    {
    }
    void print()
    {
        cout<<name<<"---"<<age<<endl;
    }
public:
    string name;
    int age;
};
int main()
{
    int a=100;
    int *p = &a;
    Stu s1("zhang",14);
    Stu s2("lili",19);
    Stu * pp = new Stu("wojiushiwo",30);
    int Stu::*pa = &Stu::age;  //pa是指向类成员变量age的指针变量
    string Stu::*pb = &Stu::name;  //pb是指向类成员变量name的指针变量
    cout<<s1.name<<s2.name<<endl;  //值:zhanglili
    cout<<s1.*pa<<"---"<<s1.*pb<<endl;  //值: 14---zhang
    void (Stu::*fa)()=&Stu::print;  //fa是指向类成员函数的函数指针
    (s1.*fa)();   //值:zhang---14
    (s2.*fa)();   //值:lili---19
    (pp->*fa)(); //值:wojiushiwo---30
    return 0;
}

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注服务器之家的更多内容!

原文链接:https://blog.csdn.net/weixin_41914179/article/details/120318344

延伸 · 阅读

精彩推荐