微信公众号: 星点课堂
新浪微博:女儿叫老白
网易云课堂:女儿叫老白
网易云课堂免费课程:《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++跨平台开发中的编译错误》。