#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!\n";
    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++结构体中使用函数与类中使用函数小结的更多相关文章

  1. 【转载】 C++多继承中重写不同基类中相同原型的虚函数

    本篇随笔为转载,原文地址:C++多继承中重写不同基类中相同原型的虚函数. 在C++多继承体系当中,在派生类中可以重写不同基类中的虚函数.下面就是一个例子: class CBaseA { public: ...

  2. Flex中如何利用FocusManager类的setFocus函数设置TextInput的焦点的例子

    参考:https://blog.csdn.net/liruizhuang/article/details/5876455 <?xml version="1.0" encodi ...

  3. android开发中关于继承activity类中方法的调用

    android开发中关于继承activity类中的函数,不能在其他类中调用其方法. MainActivity.java package com.example.testmain; import and ...

  4. asp.net 类库中获取session c#类中获取session

    asp.net  类库中获取session c#类中获取session 1. 先引入命名空间 using System.Web; using System.Web.SessionState; 在使用H ...

  5. 在动态sql的使用where时,if标签判断中,如果实体类中的某一个属性是String类型,那么就可以这样来判断连接语句:

    在动态sql的使用where时,if标签判断中,如果实体类中的某一个属性是String类型,那么就可以这样来判断连接语句: 如果是String类型的字符串进行判空的时候: <if test=&q ...

  6. 关于static函数在类中的定义和使用

    刷题的时候遇到了这样一个问题:平时经常使用 sort()函数, 对结构体进行排序, 但是在类中使用时会出现 这样的错误提示:“Solution::cmp”: 函数调用缺少参数列表:请使用“&S ...

  7. 结构体(struct)与类(class)

    在 C++ 的范畴里,除了 struct 结构体不支持访问权限修饰符(private.protected.public)外,已不再区分二者的其他方面语法上的差异. 因此,在 C++ 编程中,如果一个类 ...

  8. Swift建立栈的泛型结构体以及top()、push()、pop()定义函数的定义

    首先可以使用swift定义Stack的结构体 //泛型表达 struct Stack<T> { var items = <T>() //定义栈顶函数,返回栈顶元素 mutati ...

  9. Linux 网络编程详解一(IP套接字结构体、网络字节序,地址转换函数)

    IPv4套接字地址结构 struct sockaddr_in { uint8_t sinlen;(4个字节) sa_family_t sin_family;(4个字节) in_port_t sin_p ...

随机推荐

  1. luogu2216 [HAOI2007]理想的正方形

    先对于每一行中长度为 n 的列用单调队列搞出它们的最小/大值,再将这些长度为 n 的列想象成点再对行跑一遍 #include <iostream> #include <cstring ...

  2. 【UML】关联、依赖、泛化、实现等关系说明

    导读:再上一篇博客中,介绍了UML的9种图,现在,将对UML中的关系进行总结.图很重要,但图形中的各种关系也很重要,这扯关系的事儿,从来都是大事儿. 一.基本定义 1.1 总体说明 1.2 具体定义 ...

  3. 手写数字0-9的识别代码(SVM支持向量机)

    帮一个贴吧的朋友改的一段代码,源代码来自<机器学习实战> 原代码的功能是识别0和9两个数字 经过改动之后可以识别0~9,并且将分类器的产生和测试部分分开来写,免得每次测试数据都要重新生成分 ...

  4. [luoguP2606] [ZJOI2010]排列计数(DP)

    传送门 如果能够根据题意看出这是一个堆的话,那么就有些思路了.. 首先堆顶必须是最小元素,然后左右儿子可以预处理出来都有多少个数, 把剩余的数任意分配给两个儿子,用排列组合即可 dp(now) = d ...

  5. [HDU-4825] Xor-Sum (01字典树)

    Problem Description Zeus 和 Prometheus 做了一个游戏,Prometheus 给 Zeus 一个集合,集合中包含了N个正整数,随后 Prometheus 将向 Zeu ...

  6. hdu 3711

    #include<stdio.h> #include<math.h> #include<stdlib.h> int cmp(const void *a,const ...

  7. 洛谷P2365 任务安排 [解法一]

    题目描述 N个任务排成一个序列在一台机器上等待完成(顺序不得改变),这N个任务被分成若干批,每批包含相邻的若干任务.从时刻0开始,这些任务被分批加工,第i个任务单独完成所需的时间是Ti.在每批任务开始 ...

  8. R语言入门视频笔记--5--自定义函数

    自定义函数 你可以输出一段代码,创建一个你自己定义的函数 蛋是如果你两个自定义函数的名字重复的话,后面的会把前面的替换掉 举个栗子: hanshu1 <- function(x)  sqrt(v ...

  9. 【笔记】Linux内核中的循环缓冲区

    1. 有关ring buffer的理解 1)  ring buffer位首尾相接的buffer,即类似生活中的圆形跑道: 2)  空闲空间+数据空间=ring buffer大小 3)  ring bu ...

  10. hdu4612 无向图中任意添加一条边后使桥的数量最少 / 无向图缩点+求树的直径

    题意如上,含有重边(重边的话,俩个点就可以构成了边双连通). 先缩点成树,在求数的直径,最远的连起来,剩下边(桥)的自然最少.这里学习了树的直径求法:第一次选任意起点U,进行bfs,到达最远的一个点v ...