C++嵌套类不自动获得对外层类成员的访问权,其public/private/protected声明仅控制外部能否通过Outer::Inner方式使用该嵌套类,不影响其自身定义;嵌套类无法直接访问外层类的非静态成员。

class 内部再写一个 class,就是 C++ 嵌套类最基本写法。它不自动获得对外层类成员的访问权,也不是“内部类”那种 Java 风格的绑定关系——这点必须一开始就认清。
嵌套类声明位置决定外部能否使用
嵌套类的 public/private/protected 修饰符,只控制「类外代码能否通过 Outer::Inner 这种方式看到并使用它」,不影响嵌套类自身的定义或实现:
-
public嵌套类:外部可声明Outer::Inner x;,但依然不能直接访问Outer的非静态私有成员 -
private嵌套类:仅Outer自身及其友元能用,连Outer的派生类都不可见 -
protected嵌套类:Outer及其派生类可用,但外部代码仍不可见
嵌套类无法直接访问外层类的非静态成员
这是最常踩的坑。下面这段代码会编译失败:
class Outer {
private:
int data = 42;
public:
class Inner {
public:
void bad_access(Outer& o) {
// 错误!不能直接读 o.data
// std::cout << o.data; // ❌
}
};
};
原因很简单:Inner 和 Outer 是两个独立的类型,作用域嵌套 ≠ 访问授权。解决办法只有两个:
- 把需要访问的成员设为
public(不推荐,破坏封装) - 在
Outer中加friend class Inner;(推荐,显式授权)
静态成员是例外,嵌套类可直接访问
Outer 的 static 成员对嵌套类完全可见,无需友元声明:
立即学习“C++免费学习笔记(深入)”;
class Outer {
private:
static int static_val;
public:
class Inner {
public:
void access_static() {
std::cout << Outer::static_val; // ✅ 合法
}
};
};
int Outer::static_val = 100;
注意:必须用 Outer:: 显式限定,不能省略作用域。
嵌套类名必须带作用域才能在类外使用
哪怕 Inner 是 public 的,也不能直接写 Inner x;。所有外部使用都必须带上外层类名:
- 声明对象:
Outer::Inner obj; - 作为函数参数:
void f(Outer::Inner& i); - 模板特化或别名:
using Iter = Outer::Iterator;
遗漏 Outer:: 会导致编译器报错 'Inner' was not declared in this scope。
Iterator、Node 或 Config。但它的“嵌套”只是命名隔离,不是访问特权;想突破访问限制,只能靠 friend,没有捷径。


















