zoukankan      html  css  js  c++  java
  • 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;
    }

  • 相关阅读:
    深入浅出C#结构体——封装以太网心跳包的结构为例
    视频在线率统计——基于驱动总线设备的领域驱动设计方法落地
    在net Core3.1上基于winform实现依赖注入实例
    类与结构体性能对比测试——以封装网络心跳包为例
    基于Modbus三种CRC16校验方法的性能对比
    Git在公司内部的使用规范
    基于abp框架的数据库种子数据初始化
    VUE中登录密码显示与隐藏的最简设计——基于iview
    abp框架运行——前后端分离(基于VUE)
    基于HTTPS的接口测试——nginx配置SSL
  • 原文地址:https://www.cnblogs.com/xuyh/p/3200581.html
Copyright © 2011-2022 走看看