找回密码
 立即注册
收起左侧

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

0
回复
5061
查看
[复制链接]
累计签到:41 天
连续签到:1 天
来源: 原创 2018-9-4 10:37:15 显示全部楼层 |阅读模式

马上注册,查看详细内容!注册请先查看:注册须知

您需要 登录 才可以下载或查看,没有帐号?立即注册

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

版权声明
---------------------------------------------------------------------------------------------------------------------
该文章原创于Qter开源社区(www.qter.org
作者: 女儿叫老白 (白振勇)
转载请注明出处!
---------------------------------------------------------------------------------------------------------------------
本套课程属于:《C++跨平台开发干货》系列课程。
-----------------------------------------------------------------------------

引言
-----------------------------------------------------------------------------
       函数是C++中的基本功能特性,那么关于函数我们应该知道些啥呢?

正文
-----------------------------------------------------------------------------
函数要先声明,后定义、使用。
函数可以直接在头文件中进行定义,比如
// header.h
class 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))[5];
       pFunc是一个指向函数的指针,该函数接受一个double参数并返回一个指向含有5个int*指针数组的指针。
       2.string (*(*pFunc)(int, float, int))(int);
       pFunc是一个指向函数的指针,该函数接受3个参数(int, float, int)并且返回一个指向函数的指针,该函数接受一个int参数并返回一个string。
       3.typedef float (*(*(*pFunc)())[5])();
       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 Eckel  Chuck Allison著
更多内容,敬请关注【网易云课堂】的免费课程:C++跨平台开发干货系列-《C++跨平台开发中的编译错误》。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了