嵌套 class 的访问说明符有什么作用?
What purpose do access specifiers for nested class serve?
假设我有一个 class A 和一个私有嵌套的 class B。据我了解,这意味着 B 不属于 public API。这是否意味着 public 和私有访问说明符只服务于程序员而不是用户?有没有什么方法可能会不小心让用户访问私有嵌套 class 的 public 数据成员?
拥有私有嵌套 class 并不意味着您不能意外地将其提供给“用户”:
#include <iostream>
#include <type_traits>
class A {
private:
class B {
public:
int x = 2;
};
public:
B getB() { return B(); }
};
int main() {
A a;
// a returns B so you have access to the public member x
auto b1 = a.getB();
std::cout << b1.x << std::endl;
// or get the return type to create an instance of B
using B = std::result_of_t<decltype(&A::getB)(A)>;
B b2;
std::cout << b2.x << std::endl;
}
因此,如果您在 A
中有一个函数,即 public
,并公开 B
(或任何其他能够公开 B
的函数,并且“用户”作为访问权限)那么用户将能够引用嵌套的 class,即使它是 private
.
protected
和 private
阻止您直接引用名称,但如果您有意(或无意)以不同的方式公开它们,那么此访问修饰符将无法保护您免受那。
假设我有一个 class A 和一个私有嵌套的 class B。据我了解,这意味着 B 不属于 public API。这是否意味着 public 和私有访问说明符只服务于程序员而不是用户?有没有什么方法可能会不小心让用户访问私有嵌套 class 的 public 数据成员?
拥有私有嵌套 class 并不意味着您不能意外地将其提供给“用户”:
#include <iostream>
#include <type_traits>
class A {
private:
class B {
public:
int x = 2;
};
public:
B getB() { return B(); }
};
int main() {
A a;
// a returns B so you have access to the public member x
auto b1 = a.getB();
std::cout << b1.x << std::endl;
// or get the return type to create an instance of B
using B = std::result_of_t<decltype(&A::getB)(A)>;
B b2;
std::cout << b2.x << std::endl;
}
因此,如果您在 A
中有一个函数,即 public
,并公开 B
(或任何其他能够公开 B
的函数,并且“用户”作为访问权限)那么用户将能够引用嵌套的 class,即使它是 private
.
protected
和 private
阻止您直接引用名称,但如果您有意(或无意)以不同的方式公开它们,那么此访问修饰符将无法保护您免受那。