baizy77 发表于 2018-9-4 10:37:15

C++老鸟日记010 函数定义、声明,函数地址

本帖最后由 baizy77 于 2018-10-1 20:47 编辑

版权声明---------------------------------------------------------------------------------------------------------------------该文章原创于Qter开源社区(www.qter.org)作者: 女儿叫老白 (白振勇)转载请注明出处!---------------------------------------------------------------------------------------------------------------------课程目录:《C++老鸟日记》目录本套课程属于:《C++跨平台开发干货》系列课程。-----------------------------------------------------------------------------
引言-----------------------------------------------------------------------------       函数是C++中的基本功能特性,那么关于函数我们应该知道些啥呢?
正文-----------------------------------------------------------------------------函数要先声明,后定义、使用。函数可以直接在头文件中进行定义,比如// header.hclass CMyClass{public:       CMyClass(),m_data(0) {}      // 在头文件中定义并实现构造函数       ~CMyClass(){}                     //在头文件中定义并实现析构函数
       intgetData() {return m_data;}       voidsetData(int d) {m_data = d;}private:       intm_data;};       函数被编译并加载到内存中,因此函数也有地址。通过指针指向函数地址,对函数进行调用操作,为我们的软件设计带来了极大灵活性。       简单的函数指针:       int(*pFunc)(int, int);       该语句声明pFunc是一个指向函数的指针,它指向的函数有两个int参数,返回一个int。       复杂的函数指针:       1.int *(*(*pFunc)(double));       pFunc是一个指向函数的指针,该函数接受一个double参数并返回一个指向含有5个int*指针数组的指针。       2.string (*(*pFunc)(int, float, int))(int);       pFunc是一个指向函数的指针,该函数接受3个参数(int, float, int)并且返回一个指向函数的指针,该函数接受一个int参数并返回一个string。       3.typedef float (*(*(*pFunc)()))();       pFunc是一个指向函数的指针,该函数无参数,且返回一个指向含有5个指向函数指针数组的指针,这些函数无参数且返回float。       指向函数的指针数组,在编程是比较实用:// myclass.h class CMyClass{public:    enum eFuncID    {      EMYCLASSFUNC_NULL = 0,      EMYCLASSFUNC_P,      EMYCLASSFUNC_Q,      EMYCLASSFUNC_I,      EMYCLASSFUNC_MAX,    };    CMyClass();    ~CMyClass(){}public:    double getP(){return m_P;}    void setP(double d){ m_P = d;}     double getQ(){return m_Q;}    void setQ(double d){ m_Q = d;}     double getI(){return m_I;}    void setI(double d){ m_I = d; }     double getData(int type);    void setData(int type, double val); private:    double m_P;    double m_Q;    double m_I;        double (CMyClass ::*get_d[EMYCLASSFUNC_MAX])();// 读取数据函数指针    void (CMyClass::*set_d[EMYCLASSFUNC_MAX])(double);   // 设置数据函数指针 };
// myclass.cpp#include "myclass.h"CMyClass::CMyClass(){    get_d[EMYCLASSFUNC_P] = &CMyClass::getP;    get_d[EMYCLASSFUNC_Q] = &CMyClass::getQ;    get_d[EMYCLASSFUNC_I] = &CMyClass::getI;     set_d[EMYCLASSFUNC_P] = &CMyClass::setP;    set_d[EMYCLASSFUNC_Q] = &CMyClass::setQ;    set_d[EMYCLASSFUNC_I] = &CMyClass::setI; }double CMyClass:: getData(int type){    if (type >= 3)      return 0.f;    return (this->*get_d[type])();}void CMyClass:: setData(int type, double val){    if (type >= 3)      return;    (this->*set_d[type])(val);}// main.cpp#include "myclass.h"CMyClass obj; obj.setData(CMyClass::EMYCLASSFUNC_P, 100.f);
-----------------------------------------------------------------------------参考资料:《C++编程思想》两卷合订本中文版(3.10章节),(美) Bruce EckelChuck Allison著更多内容,敬请关注【网易云课堂】的免费课程:C++跨平台开发干货系列-《C++跨平台开发中的编译错误》。
页: [1]
查看完整版本: C++老鸟日记010 函数定义、声明,函数地址