C++知识点分享010 函数定义、声明,函数地址

微信公众号: 星点课堂

新浪微博:女儿叫老白

网易云课堂:女儿叫老白

网易云课堂免费课程:《C++跨平台开发中的编译错误》

-----------------------------------------------------------------------------

函数要先声明,后定义、使用。

函数可以直接在头文件中进行定义,比如

// header.h

class CMyClass

{

public:

       CMyClass(),m_data (0) {}      // 在头文件中定义并实现构造函数

       ~CMyClass(){}                     // 在头文件中定义并实现析构函数

 

       int getData() {return m_data;}

       void setData(int d) {m_data = d;}

private:

       int m_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。

更多内容,敬请关注【网易云课堂】的免费课程:C++跨平台开发干货系列-《C++跨平台开发中的编译错误》。

猜你喜欢

转载自blog.csdn.net/baizy77/article/details/82378519