本帖最后由 baizy77 于 2018-10-1 20:47 编辑
版权声明 --------------------------------------------------------------------------------------------------------------------- 作者: 女儿叫老白 (白振勇) 转载请注明出处! --------------------------------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------
引言 ----------------------------------------------------------------------------- 函数是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++跨平台开发中的编译错误》。
|