5.8 局部类和嵌套类
5.8.1 局部类
在一个函数体内定义的类称为局部类。局部类中只能使用它的外围作用域中的对象和函数进行联系,因为外围作用域中的变量与该局部类的对象无关。在定义局部类时需要注意:局部类中不能声明静态成员函数,并且所有成员函数都必须定义在类体内。在实践中,局部类是很少使用的。下面是一个局部类的例子:
int a;
void fun() {
static int s;
class A {
public:
void init(int i) { s = i; }
};
A m;
m.init(10);
}
在这个例子中,函数 fun()
中定义了一个局部类 A
。局部类的类名 A
被隐藏在包围它的函数 fun()
内。
5.8.2 嵌套类
在一个类中定义的类称为嵌套类。嵌套类定义可以提高抽象能力,并且强调了类的封装,从而限制用户使用该类建立对象。嵌套类的类名只能在外围类的作用域中使用。下面是一个嵌套类的例子:
class A {
public:
class B {
public:
// B的成员函数和成员变量
private:
// B的私有成员
};
void f();
private:
int a;
};
在这个例子中,类 B
是一个嵌套类,定义在类 A
的类体内。类 A
是外围类。下面是对嵌套类的一些说明:
-
作用域:
- 嵌套类被隐藏在外围类之中,该类名只能在外围类中使用。在外围类的作用域外使用该类名时,需要加类名限定。
-
访问权限:
- 嵌套类名与它的外围类的对象成员名具有相同的访问权限规则。不能访问嵌套类对象中的私有成员。
-
成员函数定义:
- 嵌套类中的成员函数不可以在它的类体外定义。
-
成员访问:
- 嵌套类中的成员不是外围类中对象的成员,反之亦然。嵌套类的成员函数对外围类的成员没有访问权,反之亦然。因此,在分析嵌套类与外围类的成员访问关系时,往往把嵌套类看作非嵌套类来处理。
-
友元:
- 在嵌套类中声明的友元对外围类的成员没有访问权。
示例代码重新组织
为了更好地理解嵌套类,可以将上面的嵌套类代码分开,以展示嵌套类实际上只是语法上的嵌入:
class A {
public:
void f();
private:
int a;
};
class B {
public:
// B的成员函数和成员变量
private:
// B的私有成员
};
通过这种方式,可以看出嵌套类仅仅是语法上的嵌入,其成员的访问权限与普通类相同。
总结
局部类和嵌套类在C++中提供了一种更细粒度的封装和作用域控制机制。局部类在函数内定义,用于限制类的作用域在函数内部,而嵌套类则在类内定义,用于实现更复杂的类结构和数据封装。这些特性有助于更好地管理代码的复杂性和安全性,但需要注意使用场景和限制。