C++不支持嵌套函数(像Pascal,Java等都支持),这给编程带来很大麻烦。
使用嵌套函数相对于全局函数有很多好处:
嵌套函数只在外层函数中有效,防止将函数作为全局函数而污染全局函数空间,使全局函数数量膨胀
嵌套函数只在外层函数中有效,程序员只需要了解外层函数即可,程序员需要了解的函数数量将减少
嵌套函数只在外层函数中有效,可以定义多个同名同原型的嵌套函数,而不会像全局函数那样只能一个
使用嵌套函数将使外层函数层次更加清晰。
使用嵌套函数的唯一缺点是不能在多个函数之间共享(那是全局函数要做的事情),容易在各个外层函数中使用复制粘贴来定义函数。
程序要根据不同使用场合来决定一个函数应该是全局函数还是嵌套函数。原则是:
1.凡是需要在多个函数中共享的,一般都定义为全局函数
2.如果一个全局函数只被另外一个函数调用,那么考虑将这个函数改为调用者的嵌套函数
3.如果一个函数体过长,可以考虑按照一定的逻辑将其划分为几个嵌套函数
4.如果一个函数体有重复编码一段代码,那么考虑将这段代码提取成为一个嵌套函数
有关全局函数和嵌套函数的说明一般也适合于一个类,从类的空间来说,类的成员函数相当于全局函数。
当应用于类的时候,使用类成员函数还是嵌套函数还需要考虑一下几点:
1.由于类有自己的命名空间,一般不会污染全局函数空间
2.如果不想让程序员了解更多内层函数,将其声明成private或者protected
3.如果一个成员函数只被另一个成员函数调用,可以这个函数改为调用者的嵌套函数,
如果这个函数需要访问类的数据成员,则需要传递this指针,或者可以考虑仍然为成员函数
4.将过长成员函数体分割为几个嵌套函数时,可能也需要传递体this指针
下文介绍一种C++中支持函数嵌套的变通方法:
首先,将下面两段宏拷贝到需要使用嵌套函数的地方(如StdAfx.h文件的末尾):
//
#define BEGIN_NEST_FUNCTION(ReturnType, FunName, ParamListWithRoundBrackets) \
struct Functor_##FunName \
{ \
ReturnType operator() ParamListWithRoundBrackets const
#define END_NEST_FUNCTION(FunName) \
}; \
static const Functor_##FunName FunName;
//
其中,
FunName是函数的名称,
ReturnType是函数的返回值,
ParamListWithRoundBrackets是参数列表,必须用圆括号括起来(...),如果没有参数列表,也必须用空的圆括号()
其次,在某一个函数中使用BEGIN_NEST_FUNCTION和END_NEST_FUNCTION宏,将函数体扩起来,例如:
void main()
{
//定义一个嵌套函数Add,返回值是int,参数是int a 和 int b,参数列表要用括号括起来
BEGIN_NEST_FUNCTION(int, Add, (int a, int b))
{
return a+b;
}
END_NEST_FUNCTION(Add);
//调用嵌套函数
int c = Add(1, 2);
}