c++嵌套类和局部类详细介绍

1️⃣ 嵌套类(Nested Class)

概念

嵌套类 是在一个类的内部定义的类,定义它的那个类称为 外部类(Enclosing Class)。嵌套类在逻辑上是外部类的成员,但它有自己独立的作用域和访问控制。


语法形式

cpp

运行

复制代码
class OuterClass {
public:
    // 嵌套类
    class InnerClass {
    public:
        void display();
    };
};

特点

  1. 作用域
    • 嵌套类的名字只在外部类作用域内可见。
    • 在外部使用时需要加外部类名限定:OuterClass::InnerClass
  2. 访问权限
    • 外部类和嵌套类之间默认互相不能访问对方的私有成员(除非显式声明友元)。
    • 嵌套类可以直接访问外部类的 static 成员(如果权限允许)。
  3. 生命周期
    • 嵌套类对象的生命周期独立于外部类对象。

案例代码

cpp

运行

复制代码
#include <iostream>
using namespace std;

class OuterClass {
private:
    int outerData = 100;
public:
    static int staticOuterData;

    // 嵌套类
    class InnerClass {
    private:
        int innerData = 200;
    public:
        void showOuterStatic() {
            // 可以直接访问外部类的静态成员
            cout << "Outer static data: " << staticOuterData << endl;
        }

        void showInner() {
            cout << "Inner data: " << innerData << endl;
        }
    };
};

// 初始化外部类静态成员
int OuterClass::staticOuterData = 50;

int main() {
    // 创建嵌套类对象(需要外部类名限定)
    OuterClass::InnerClass innerObj;

    innerObj.showOuterStatic(); // 访问外部类静态成员
    innerObj.showInner();       // 访问嵌套类自己的成员

    return 0;
}

运行结果:

plaintext

复制代码
Outer static data: 50
Inner data: 200

2️⃣ 局部类(Local Class)

概念

局部类 是在函数体内定义的类,它的作用域仅限于该函数内部。


语法形式

cpp

运行

复制代码
void someFunction() {
    class LocalClass {
    public:
        void doSomething();
    };
}

特点

  1. 作用域
    • 仅在定义它的函数内可见,出了函数作用域就不能使用。
  2. 成员函数
    • 必须在类体内定义(不能在类外定义)。
  3. 静态成员
    • 不能有静态成员变量(因为静态成员需要类外定义,而局部类作用域不允许)。
  4. 访问外部变量
    • 可以访问外部作用域的静态变量枚举常量
    • 不能访问函数的非静态局部变量(除非是 C++11 捕获的 lambda,而局部类本身不支持捕获)。

案例代码

cpp

运行

复制代码
#include <iostream>
using namespace std;

void testLocalClass() {
    static int staticVar = 10; // 静态局部变量
    int normalVar = 20;        // 普通局部变量

    // 局部类
    class LocalClass {
    public:
        void print() {
            cout << "Static var: " << staticVar << endl; // ✅ 可以访问静态变量
            // cout << normalVar << endl; // ❌ 不能访问非静态局部变量
        }
    };

    LocalClass obj;
    obj.print();
}

int main() {
    testLocalClass();

    // LocalClass obj2; // ❌ 错误:局部类在函数外部不可见
    return 0;
}

运行结果:

plaintext

复制代码
Static var: 10

3️⃣ 对比总结

对比维度 嵌套类(Nested Class) 局部类(Local Class)
定义位置 类的内部 函数的内部
作用域 外部类作用域内 仅函数作用域内
访问外部成员 可访问外部类的 static 成员(需权限) 可访问函数的 static 变量和枚举
成员函数定义 可在类内或类外定义(类外需限定) 必须在类体内定义
静态成员变量 允许 不允许
使用场景 逻辑上属于外部类的辅助类,如迭代器 函数内临时使用的类,不暴露给外部

4️⃣ 记忆口诀

  • 嵌套类:住在别人家里的类,只能通过 "门牌号(外部类名)" 找到它。
  • 局部类:住在房间里的临时小纸条,出门就扔了,别人看不到。

📊 嵌套类作用域图

plaintext

复制代码
全局作用域
┌─────────────────────────────────────────────────────────────┐
│ class OuterClass {                                         │
│  ┌─────────────────────────────────────────────────────┐    │
│  │  public:                                           │    │
│  │      class InnerClass {                            │    │
│  │      public:                                       │    │
│  │          void display();                          │    │
│  │      };                                            │    │
│  └─────────────────────────────────────────────────────┘    │
│                                                             │
│  // 外部类成员                                             │
│  void useInner() { InnerClass obj; }                       │
└─────────────────────────────────────────────────────────────┘

可见范围(嵌套类):
- 在 OuterClass 内部:可以直接用 InnerClass
- 在外部类外部:必须用 OuterClass::InnerClass

箭头示意:

plaintext

复制代码
main() 中:
    OuterClass::InnerClass obj;  ← 可以(需限定作用域)
    InnerClass obj2;             ← ❌ 错误(找不到名字)

📊 局部类作用域图

plaintext

复制代码
全局作用域
┌─────────────────────────────────────────────────────────────┐
│ void someFunction() {                                      │
│  ┌─────────────────────────────────────────────────────┐    │
│  │  class LocalClass {                                 │    │
│  │  public:                                            │    │
│  │      void doSomething();                            │    │
│  │  };                                                 │    │
│  └─────────────────────────────────────────────────────┘    │
│                                                             │
│  LocalClass obj; // ✅ 可以使用                              │
└─────────────────────────────────────────────────────────────┘

可见范围(局部类):
- 仅在 someFunction() 内部可见
- 函数外完全不可见

箭头示意:

plaintext

复制代码
main() 中:
    LocalClass obj;  ← ❌ 错误(局部类作用域仅限函数内)

程序源码如下:

cpp 复制代码
#include "head.h"
#include "function.h"

/*
	嵌套类
*/
class OuterClass {
	
//成员变量
private:
	int outerDate = 100;
public:
	static int staticOuterDate;

	//嵌套类
	class InnerClass {
	private:
		int innerPrivateData = 200;
	public:
		int innerPublicDate = 100;
	public:
		void showOuterStatic() {
			//可以直接访问外部类的静态成员
			cout << "Outer static data:" << staticOuterDate << endl;
		
			//不能访问外部类的非静态成员
			//cout << "Outer data:" << outerDate << endl;
		}
		
		void showInner() {
			cout << "Inner data:" << innerPrivateData << endl;
		}
	};

	//成员方法
public:
	void printInfo() {
		cout << this->outerDate << endl
			<< this->staticOuterDate << endl;
		
	}
};

//初始化外部类的静态成员
int OuterClass::staticOuterDate = 50;

/*
	局部类
*/
void testLocalClass() {

	static int staticVar = 10;	//静态局部变量
	int normalVar = 20;	//普通局部变量

	//局部类
	class LocalClass {
	public:
		void print() {
			//可以访问静态变量
			cout << "static var:" << staticVar << endl;

			//不能访问非静态局部变量
			//cout << normalVar << endl;
		}
	};

	//实例化局部类
	LocalClass obj;
	obj.print();
}

/*
	测试函数方法
*/
//外部类测试函数
void testOuterClass() {
	//外部类的使用
	OuterClass oc;
	oc.printInfo();
	cout << "oc.staticOuterDate:" << oc.staticOuterDate << endl;
	
	//创建嵌套类对象(需要外部类名限定)
	OuterClass::InnerClass innerObj;
	
	innerObj.showOuterStatic();	//访问外部类静态成员
	innerObj.showInner();	//访问嵌套类自己的成员
}

//局部类测试方法


int main() {

	//testOuterClass();

	testLocalClass();

	//错误:局部类在函数外部不可见
	//LocalClass obj2;

	return 0;
}
相关推荐
冷崖6 分钟前
const 与 constexpr
c++·学习
DokiDoki之父10 分钟前
Spring—容器
java·后端·spring
一个龙的传说10 分钟前
springboot优雅停止的流程梳理
java·spring boot·rpc
枫叶丹434 分钟前
【Qt开发】多元素类控件(三)-> QTreeWidget
开发语言·数据库·c++·qt
晨非辰38 分钟前
【数据结构入坑指南】--《层序分明:堆的实现、排序与TOP-K问题一站式攻克(源码实战)》
c语言·开发语言·数据结构·算法·面试
hansang_IR1 小时前
【题解】P2217 [HAOI2007] 分割矩阵 [记忆化搜索]
c++·数学·算法·记忆化搜索·深搜
洲覆1 小时前
Redis 驱动适配 Reactor 模式
开发语言·网络·数据库·redis
fl1768311 小时前
基于matlab实现的DnCNN网络
开发语言·matlab
第二层皮-合肥1 小时前
如何设置等长的最大走线长度
服务器·开发语言·php
搬砖的工人1 小时前
记录WinFrom 使用 Autoupdater.NET.Official 进行软件升级更新
java·前端·.net