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]