C++结构体中使用函数与类中使用函数小结

#include <iostream>
#include <string.h>
using namespace std;
struct stud//学生信息结构体
{
    char name[10];
    int num;
    int (* set_info)(char *, int*);//设置学生信息,一般使用回调函数
    void (* print_info)(char *, int);//打印学生信息,一般使用回调函数
};
int setinfo(char *name, int *num)//此函数结构体中普通变量赋值
{
    strcpy(name, "zhang_san");
    *num = 1001;
    return 0;
}
void printinfo(char *name, int num)//打印结构体重普通变量
{
    cout << "name :" << name << endl;
    cout << "num  :" << num  << endl;
}

class Time  //时间信息类
{
    public :
        Time(int = 10, int = 10, int = 10);//构造函数
        ~Time();                        //析构函数
         int set_time(int ,int, int);   //普通函数
         void print_time();             //普通函数
    private:                //普通数据设置为私有
        int hour;
        int minute;
        int sec;
};
Time:: Time(int h, int m, int s)//定义构造函数
{
    hour = h;
    sec = s;
    minute = m;
}
Time:: ~Time() //定义析构函数(注意析构函数不能带参数)
{
    cout << "Will end time! ";
    cout << hour << ":" << minute << ":" << sec << endl;
}

int Time::set_time(int h, int s, int m)//定义设置时间函数
{
    hour = h, sec = s, minute = m;

    return 0;
}
void Time:: print_time()        //定义打印时间函数
{
    cout << hour << ":" << minute << ":" << sec << endl;
}

int main()
{
    //结构体操作
    struct stud student;
  
    student.set_info = setinfo;//或者直接赋值setinfo
    //student.set_info(student.name, &student.num);
    (*student.set_info)(student.name, &student.num);
    student.print_info = &printinfo;
    (*student.print_info)(student.name, student.num);
    //student.print_info(student.name, student.num);//也是正确的
 

   
   
    //类的操作
    Time t;
    class Time *ctime = &t;
    (ctime->print_time)();
   
    int (Time:: *p)(int ,int ,int);
    p = &Time::set_time;    //只能如此赋值
    (ctime->*p)(20, 45, 35);

    void (Time:: *print)();
    print = &Time::print_time; //只能如此赋值
    (ctime->*print)(); //只能如此使用


    //综上可知: 在类中若使用回调函数(即函数指针)则只能p = &Time::set_time;
    //若调用此回调函数只能(ctime->*p)(?, ?, ?);其他都是非法的
    //而在结构体中继承的C语言特性,对函数操作函数名与函数取地址几乎等价的

    return 0;
}

原文地址:https://www.cnblogs.com/xuyh/p/3200581.html