C++ 不支持嵌套函数。然而,一个与嵌套函数不同但更加晦涩的特性,局部类(local class),能够让我们模拟嵌套函数这一特性。下面我将说明如何使用这一特性,以及什么时候应该使用这一特性。
对于一个命名空间作用域中声明的一般类,在缺省情况它具有外部连接(linkage),并且其外部连接对于程序的任何模块都是可见的。相反,在一个局部作用域定义的类,是没有外部连接的,正如下面的例子所示。因此,它对于其它任何作用域都是不可见的。
intgettime()
{
class Time //a local class inside a function
{
public:
std::time_tcurrentTime()
const
{
return std::time(0);
}
};//Time
return Time().currentTime();
}
局部类可以有一些成员函数、一些构造函数、一个析构函数和一些数据成员,但是它不能具有静态数据成员。此外,局部类的所有成员函数都必须在它们的类定义中定义。
局部类对于隐藏实现细节是非常有用的。如果客户得到一个包含gettime() 函数的二进制文件,那么他只能看到gettime() 函数的原型,而不能看到它是如何实现的。通过定义局部类,你可以在不暴露底层实现的情况下发布二进制文件和函数原型。另外,局部类作为“辅助对象(helper object)”也是很有用的,所谓辅助对象,是指执行非常具体的操作的特定类的实例,比如执行计算、转换等操作,这类非常具体的操作只在某一地方才必要。注意除了局部类之外,还可以定义局部结构体(struct)、局部联合(union)和局部枚举(enum)等类型。
通过把逻辑步骤或计算分解到单个的局部类中,我们就可以在不暴露实现细节的情况下实现更高层次的模块化。而且,因为局部类没有连接(linkage),所以它的名字以及它的成员的名字不会传播到其它命名空间,因此可以最大限度地降低命名冲突的风险。局部类的不足之处在于它们不能重用。