当前位置: 首页 > article >正文

【C++指南】类和对象(九):内部类

           💓 博客主页:倔强的石头的CSDN主页 

           📝Gitee主页:倔强的石头的gitee主页

            ⏩ 文章专栏:《C++指南》

                                  期待您的关注

 

47f09392526c71b5885ec838a3ea7ffe.gif

引言

在 C++ 编程中,内部类(也称为嵌套类)是一个定义在另一个类作用域内的类

内部类提供了一种封装和逻辑分组的方式,使得代码更加模块化和易于管理。

本文将详细介绍 C++ 中内部类的定义、使用场景、访问权限及其与外围类(外部类)的相互作用。

目录

引言

🍃内部类的定义

🍃内部类与外部类的相互作用

1.内部类访问外部类的成员:

2.外部类访问内部类的成员:

🍃内部类的使用场景

结语


 

 

 

🍃内部类的定义

内部类是在一个类的成员部分定义的另一个类。

内部类是⼀个独立的类,跟定义在 全局相比,他只是受外部类类域限制和访问限定符限制,所以外部类定义的对象中不包含内部类。

  • 计算外部类对象的大小就不会将内部类的成员包括在内

简单来说内部类与外部类的关系就是:(划重点)

内部类是外部类的友元类,但外部类不是内部类的友元类,并且内部类受到外部类类域限制和访问限定符限制。

 

🍃内部类与外部类的相互作用

1.内部类访问外部类的成员

简单来说:内部类默认是外部类的友元类

        <1>内部类可以定义在外部类的public、protected、private中都是可以的。

        <2>内部类可以直接访问外部类中的static、枚举成员、不需要外部类的对象名。

        <3>内部类访问外部类的普通成员,需要借助外部类对象(否则无法得知访问的是哪一个对象的)

 例如:

#include <iostream>  
using namespace std;
class A
{
private: static int k;
               int h;
public: class B{
                     void foo(){
                           cout<<k<<endl;//OK
                           //cout<<h<<endl;//ERROR
                     }
              };
};
int A::k=3;

这里cout<<h<<endl;是一个非常常见的错误。因为内部类是一个独立的类,不属于外部类,所以此时还没有外部类的对象,显然也不存在h。

而k就不同了,静态成员不需要外部类的对象就已存在,所以这里k是OK的。

 

想要在内部类访问外部类的普通成员,就需要通过外部类对象的方式,比如下方代码,传递一个外部类对象作为参数就可以访问外部类成员

#include <iostream>  
using namespace std;
class A
{
private: static int k;
       int h;
public: class B {
    void foo(const A& a ) 
    {
        cout << k << endl;//外部类的静态成员,内部类可以直接访问
        cout<<a.h<<endl;//外部类的普通成员,内部类需要借助外部类对象访问
    }
};
};
int A::k = 3;

 

2.外部类访问内部类的成员

内部类不属于外部类,更不能通过外部类的对象去调用内部类。外部类对内部类没有任何优越的访问权限。

 

内部类在定义它的外围类的作用域内是可见的,但在外围类外部是不可见的。 

  • 假如内部类受外部类公有限定符限制,需要通过外部类限定符限定的方式创建内部类对象
  • 假如内部类是受外部私有或保护限定符限制,那么在类外无法创建内部类的对象(如果你不想外部可以创建内部类的对象,就可以这么做)
  • 外部类无法访问内部类的私有成员
#include<iostream>
using namespace std;
class A
{
private:
    static int _k;
    int _h = 1;
public:
    class B // B默认就是A的友元

    {
    public:
        void foo(const A& a)
        {
            cout << _k << endl; //OK
            cout << a._h << endl; //OK
        }
    private:
        static int a;
    };
    void fun()
    {
        //cout << B::a << endl;
        //外部类无法访问内部类的私有成员
    }
    
};
int A::_k = 1;
int main()
{
    
    A::B b;//假如内部类受外部类公有限定符限制,可以这样创建内部类对象
    A aa;
    
    return 0;
}

 

🍃内部类的使用场景

  1. 封装和隐藏实现细节:内部类可以隐藏实现细节,使得外围类的接口更加简洁。————内部类本质也是⼀种封装,当A类跟B类紧密关联,A类实现出来主要就是给B类使用,那么可以考 虑把A类设计为B的内部类,如果放到private/protected位置,那么A类就是B类的专属内部类,其他地方都用不了
  2. 实现辅助类内部类可以作为外围类的辅助类,用于实现一些具体的功能,而不影响外围类的整体结构。
  3. 避免命名冲突:通过内部类,可以避免不同命名空间或类中的命名冲突。
  4. 访问权限控制:内部类可以更好地控制对特定成员或方法的访问权限。

 

 

结语

C++ 中的内部类提供了一种灵活的方式来封装和隐藏实现细节,使得代码更加模块化和易于管理。

通过内部类,可以更好地控制访问权限,避免命名冲突,并实现辅助类来支持外围类的功能。

理解内部类的定义、访问权限及其与外围类的相互作用,对于编写高质量的 C++ 代码至关重要。

 


http://www.kler.cn/a/512819.html

相关文章:

  • (undone) 并行计算学习 (Day2: 什么是 “伪共享” ?)
  • Ubuntu22部署MySQL5.7详细教程
  • 【vitePress】基于github快速添加评论功能(giscus)
  • 深度学习 DAY2:Transformer(一部分)
  • OpenCV相机标定与3D重建(63)校正图像的畸变函数undistort()的使用
  • 《Linux服务与安全管理》| 邮件服务器安装和配置
  • 【JAVA】最新jdk23下载安装
  • Java Web开发高级——消息队列与异步处理
  • 整体隔离版全链路压测
  • TaskBuilder触发前端组件请求后台服务的常见事件
  • 人工智能核心知识:AI Agent的四种关键设计模式
  • 【深度学习】Java DL4J基于多层感知机(MLP)构建公共交通优化模型
  • 如何使用MaskerLogger防止敏感数据发生泄露
  • cherry-pick使用
  • 【wiki知识库】07.用户管理后端SpringBoot部分
  • 日本工作面试基本礼仪-一篇梗概
  • 商城系统中的常见 BUG
  • # [0114] Task01 《数学建模导论》P1 解析几何与方程模型
  • html与css学习笔记(2)
  • 微信小程序中实现背景图片完全覆盖显示,可以通过设置CSS样式来实现
  • Spring MVC:HTTP 请求的参数传递2.0
  • 【Python】JSON
  • K8S中Pod控制器之Job控制器
  • 一文玩转生成式AI新星DeepSeek-V3,带你5分钟配置自己的随身AI
  • 【QT】已解决:Qt4.11.0无法使用MSVC编译器问题
  • Python入门:3.Python的输入和输出格式化