面试题答案
一键面试强化封装性及访问控制
- 强化封装性:
- 嵌套类将相关的类定义放在另一个类的内部,使得该嵌套类的作用域被限制在外部类内部。这减少了命名空间的污染,因为嵌套类的名字不会和外部其他类名冲突。例如,在一个大型项目中,可能有多个模块都定义了名为
Helper
的类,但如果这些Helper
类作为不同外部类的嵌套类,它们之间不会产生命名冲突,提高了代码的可维护性和封装性。 - 嵌套类可以访问外部类的非公有成员,同时又对外部类隐藏其实现细节。外部类可以像使用其他成员一样使用嵌套类,而外部代码无法直接访问嵌套类,除非通过外部类提供的接口。这使得外部类可以更好地控制对嵌套类的访问,进一步强化了封装性。
- 嵌套类将相关的类定义放在另一个类的内部,使得该嵌套类的作用域被限制在外部类内部。这减少了命名空间的污染,因为嵌套类的名字不会和外部其他类名冲突。例如,在一个大型项目中,可能有多个模块都定义了名为
- 提供更细粒度的访问控制:
- 外部类可以控制嵌套类的访问级别,比如将嵌套类定义为
private
,则只有外部类的成员函数可以使用该嵌套类;定义为protected
,则外部类及其派生类的成员函数可以使用;定义为public
,则任何可以访问外部类的代码都可以使用该嵌套类。这种灵活的访问控制使得代码的访问权限可以根据实际需求进行精细调整。
- 外部类可以控制嵌套类的访问级别,比如将嵌套类定义为
代码设计思路及关键代码片段
- 代码设计思路:
- 首先定义外部类,包含私有成员。
- 在外部类内部定义嵌套类,嵌套类需要访问外部类的私有成员。
- 在外部类中提供一个成员函数,该函数接受嵌套类的对象作为参数,并在函数内部调用嵌套类的成员函数,让嵌套类通过这个外部类的成员函数间接访问外部类的私有成员。
- 关键代码片段:
#include <iostream>
class Outer {
private:
int privateData;
public:
Outer(int data) : privateData(data) {}
class Inner {
public:
void accessOuterPrivate(Outer& outer) {
std::cout << "Accessed Outer's private data: " << outer.privateData << std::endl;
}
};
void allowInnerAccess(Inner inner) {
inner.accessOuterPrivate(*this);
}
};
int main() {
Outer outer(42);
Outer::Inner inner;
outer.allowInnerAccess(inner);
return 0;
}
在上述代码中:
Outer
类有一个私有成员privateData
。Inner
类是Outer
类的嵌套类,Inner
类的accessOuterPrivate
函数需要访问Outer
类的私有成员privateData
。Outer
类的allowInnerAccess
函数接受Inner
类对象作为参数,并通过调用Inner
类的accessOuterPrivate
函数,使得Inner
类可以间接访问Outer
类的私有成员,同时保证了Outer
类的封装性。