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
<p>原因很简单:<code>Inner</code> 和 <code>Outer</code> 是两个独立的类型,作用域嵌套 ≠ 访问授权。解决办法只有两个:</p>
- 把需要访问的成员设为
public(不推荐,破坏封装) - 在
Outer中加friend class Inner;(推荐,显式授权)
静态成员是例外,嵌套类可直接访问
Outer 的 static 成员对嵌套类完全可见,无需友元声明:
class Outer {
private:
static int static_val;
public:
class Inner {
public:
void access_static() {
std::cout
<p>注意:必须用 <code>Outer::</code> 显式限定,不能省略作用域。</p>
<h3>嵌套类名必须带作用域才能在类外使用</h3>
<p>哪怕 <code>Inner</code> 是 <code>public</code> 的,也不能直接写 <code>Inner x;</code>。所有外部使用都必须带上外层类名:</p>
- 声明对象:
Outer::Inner obj; - 作为函数参数:
void f(Outer::Inner& i); - 模板特化或别名:
using Iter = Outer::Iterator;
遗漏 Outer:: 会导致编译器报错 'Inner' was not declared in this scope。
Iterator、Node 或 Config。但它的“嵌套”只是命名隔离,不是访问特权;想突破访问限制,只能靠 friend,没有捷径。C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











