函数指针的赋值(effective c++ item 35)
Assignment of function pointers (effective c++ item 35)
在effective c++, item 35中,作者通过函数指针引入了策略模式。具体在第 172 页
class GameCharacter;
int defaultHealthCalc(const GameCharacter& gc);
class GameCharacter {
public:
typedef int (*HealthCalcFunc)(const GameCharacter&);
explicit GameCharacter(HealthCalcFunc hcf = defaultHealthCalc)//why not &defaultHealthCalc?
: healthFunc(hcf)
{}
int healthValue() const
{ return healthFunc(*this); }
...
private:
HealthCalcFunc healthFunc;
};
第六行,为什么函数指针HealthCalcFunc
的赋值是defaultHealthCalc
而不是&defaultHealthCalc
?
由于编译器知道您正在为指向函数的指针赋值,因此指定所需函数的名称就足够了——语法是明确的。
如果您想添加 & 符号以使其清晰,语法允许这样做,但这不是必需的。
类似地,当从指针调用函数时,您可以直接使用指针的名称(如示例代码中所做的那样),或使用“*”运算符显式取消引用它。在这两种情况下,编译器都知道你的意思。
在effective c++, item 35中,作者通过函数指针引入了策略模式。具体在第 172 页
class GameCharacter;
int defaultHealthCalc(const GameCharacter& gc);
class GameCharacter {
public:
typedef int (*HealthCalcFunc)(const GameCharacter&);
explicit GameCharacter(HealthCalcFunc hcf = defaultHealthCalc)//why not &defaultHealthCalc?
: healthFunc(hcf)
{}
int healthValue() const
{ return healthFunc(*this); }
...
private:
HealthCalcFunc healthFunc;
};
第六行,为什么函数指针HealthCalcFunc
的赋值是defaultHealthCalc
而不是&defaultHealthCalc
?
由于编译器知道您正在为指向函数的指针赋值,因此指定所需函数的名称就足够了——语法是明确的。
如果您想添加 & 符号以使其清晰,语法允许这样做,但这不是必需的。
类似地,当从指针调用函数时,您可以直接使用指针的名称(如示例代码中所做的那样),或使用“*”运算符显式取消引用它。在这两种情况下,编译器都知道你的意思。