实际应用中大部分的类都是定义在头文件中,且一个头文件一般都只定义一个类,这样做不仅代码简洁,逻辑清楚其实还有一个好处就是保持类的定义一致
类可以在函数体内定义,但是在函数体内定义的类即局部类受到了一些限制,所以类一般都不定义在函数体内;
在函数体外定义类时,在各个知道的源文件中可能只有一处该类的定义,而且如果要在不同的文件中使用同一个类,类的定义就必须保持一致,
为了确保各个文件中的类定义一致,类通常定义在头文件中,而且当一个头文件中只有一个类时,类所在头文件的名字应与类的名字一样
局部类:局部类的所有成员(包括函数在内)都必须完整定义在类的内部。因此,局部类的作用与嵌套类相比相差很远
在实际编程的过程中,因为局部类的成员必须完整定义在类的内部,所以成员函数的复杂性不可能太高。局部类的成员函数一般只有几行代码,否则我们就很难读懂它了。
类似的,在局部类中也不允许声明静态数据成员,因为我们没法定义这样的成员。
局部类不能使用函数作用域中的变量
局部类对其外层作用域中名字的访问权限收到很多限制,局部类只能访问外层作用域定义的类型名,静态变量以及枚举成员。
如果局部类定义在某个函数内部,则该函数的普通局部变量不能被局部变量使用
常规的访问保护规则对局部类同样适用
外层函数对局部类的私有成员没有任何访问特权。当然,局部类可以将外层函数声明为友元:或者更常见的情况是局部类将其成员声明成公有的。
在程序中有权访问局部类的代码非常有限。局部类已经封装在函数作用域中,用过信息隐藏进一步封装就显得没有什么必要了
局部类中的名字查找
局部类内部的名字查找次序与其他类相似。在声明类的成员时,必须先确保用到的名字位于作用域中,然后再使用该名字。
定义成员时用到的名字可以出现在类的任意位置。如果某个名字不是局部类的成员,则继续在外层函数作用域中查找;如果还没找到,则在外层函数所在作用域中查找
嵌套的局部类
可以在局部类的内部再嵌套一个类,此时,嵌套类的定义可以出现在局部类之外。不过,嵌套类必须定义在与局部类相同的作用域中。
void foo()
{
class Bar {
public:
//...
class Nested; //声明Nested类
}
// 定义Nested类
class Bar::Nested {
//...
};
}
和往常例子一样,当我们在类的外部定义成员时,必须指明该成员所属的作用域。因此在往常的例子中,Bar::Nested的意思是Nested是定义在Bar的作用域内的一个类。
局部类内的嵌套类也是一个局部类,必须遵守局部类的各种规定。嵌套类的所有成员都必须定义在嵌套类内部