C++基础系列(一) 对象指针

一. 函数指针和指针函数

1.1 函数指针

         这两个是C语言里两个比较绕的概念,我们先说一下函数指针

         函数指针本质是一个指针,该指针的地址指向了一个函数。

         在程序中定义了一个函数,那么在编译时系统就会为这个函数代码分配一段存储空间,这段存储空间的首地址称为这个函数的地址,而且函数名表示的就是这个地址。

        写法如下:   

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

        int  (*fun) (int a , int b);

1.2 指针函数

         指针函数本质是一个函数, 其返回值为指针

         指针函数是一个函数。函数都有返回类型(如果不返回值,则为无值型),只不过指针函数返回类型是某一类型的指针。

        写法如下:

        *类型标识符 函数名(参数表);

        int  *fun(int x,int y);

       常规函数和指针函数区别: 在函数名前面多了一个 * 号,而这个函数就是一个指针函数。其返回值是一个 int 类型的指针,是一个地址。

其他理解方式:

指针函数:int* fun(int x,int y);

函数指针:int (*fun)(int x,int y);

可以简单粗暴的理解为,指针函数的*是属于数据类型的,而函数指针的星号是属于函数名的。

一个很简单的判定方法就是观察(*),记住其中一个即可:

int (*p)(int,int);有括号,*与p结合,*p就是个指针,指向返回值为整型且有两个整型参数的函数的指针,因此称为函数指针。

int*p(int,int); 没有括号,*与int结合,int*为返回类型,p就是一个函数名,这时就是一个指针函数,只不过返回值类型为int*。

二. 对象指针

      我们在来看看C++中的对象指针

2.1 指向对象成员函数的指针

        需要注意的:定义指向对象成员函数的指针变量的方法和定义指向普通函数的指针变量方法所有不同。

        指向普通函数的指针变量就是第一小节中说的函数指针

   而定义一个指向对象成员函数的指针变量要复杂一点,直接通过代码来说明

#include <iostream>
using namespace std;

class Time {
    public:
    Time(int, int, int);  //声明带参构造函数
    int hour;
    int minute;
    int sec;
    void get_time(); // 声明共有成员函数
};


Time :: Time(int h, int m, int s) {
    hour = h;
    minute = m;
    sec = s;
}

void Time::get_time() {
    cout<<hour <<":" <<minute << ":" << sec << endl;
}

int main(int argc, const char** argv){
    Time t1(10, 20, 25);  // 定义Time对象t1
    int *p = &t1.hour; //定义指向整型数据的指针变量p  并使p指向t1.hour
    cout<< *p << endl;  
    
    t1.get_time(); //调用对象 t1的成员函数get_time()

    Time *p2 = &t1;  //定义指向Time 类对象的指针变量 p2, 并使 p2指向   t1
    p2->get_time();  // 调用  p2 所指对象(即t1)的get_time() 方法

    void (Time :: *p3) (); //定义指向Time类公用成员函数的指针变量p3;
    p3 = &Time::get_time;  // 使p3指向Time类公用成员函数get_time();

    (t1.*p3)(); //调用对象 t1中   p3所指的成员函数即 t1.get_time();

     void (Time :: *p4) () = &Time::get_time; // 定义指针变量时指定其指向

    return 0;
}

打印输出:

10
10:20:25
10:20:25
10:20:25