C++编程法则100条(9)关于内嵌类的使用细节
创始人
2024-06-01 14:48:07
0

🎀 关于博主👇🏻👇🏻👇🏻

🥇 作者简介: 热衷于知识探索和分享的技术博主。
💂 csdn主页::【奇妙之二进制】
✍️ 微信公众号:【Linux 世界】

🎉精彩专栏:

💪 【C++编程法则100条】
🎓 【面向工作git基础教程】
​ 🧡 【C++11新特性深入剖析】
​ 📚【shell脚本编程基础与实战】
​ 🌎【Linux网络编程面试演练】
✍️ 【C++编译工具cmake入门到精通】
​ …

💂关于作者: 曾就职于国内知名安防上市公司,现就职于国内知名AMR机器人公司,担任高级系统软件工程师。2020年至今保持CSDN博客专家,CSDN C/C++领域优质创作者头衔。全网5万+粉丝。十载寒冰,难凉热血;多年过去,历经变迁,物是人非。 然而,对于技术的探索和追求从未停歇。 💪坚持创作,热衷分享,初心未改,继往开来!

参考:https://en.cppreference.com/w/cpp/language/nested_types

文章目录

    • 定义
    • 嵌套类可以类内声明,类外实现
    • 类里面允许嵌套定义类,这样的类叫做内嵌类。

定义

可以在类的内部定义类,这样的类叫做内嵌类。内嵌类能包裹类的所有成员(包括私有成员),但是它和包裹类没有任何的继承关系、组成关系,它们实际上是两个不同的类型,所以内嵌类尽管可以访问包裹类的所有成员,但是需要通过对象来访问非静态成员,静态成员可以直接访问。

int x,y; // globals
class enclose // enclosing class
{// note: private membersint x;static int s;
public:struct inner // nested class{void f(int i){x = i; // Error: can't write to non-static enclose::x without instanceint a = sizeof x; // Error until C++11,// OK in C++11: operand of sizeof is unevaluated,// this use of the non-static enclose::x is allowed.s = i;   // OK: can assign to the static enclose::s::x = i; // OK: can assign to global xy = i;   // OK: can assign to global y}void g(enclose* p, int i){p->x = i; // OK: assign to enclose::x}};
};

在上面的例子中,x是enclose的私有成员,但是内嵌类inner可以通过实例化enclose来访问x,而静态成员s可以直接访问。

内嵌类,打破了包裹类的权限访问控制,打破了封装的理念,所以个人觉得,还是慎用。

嵌套类可以类内声明,类外实现

嵌套类的作用域在包裹类里面,也就说访问嵌套类时,需要加上包裹类的前缀 enclose::nested

当嵌套类比较复杂时,直接写在类里面可能会导致类看起来比较混乱,可以选择将嵌套类的实现写到外面。

class enclose
{class nested1;    // forward declarationclass nested2;    // forward declarationclass nested1 {}; // definition of nested class
};class enclose::nested2 { }; // definition of nested class

嵌套类往往是类的一些内部结构体,或者内部帮助类,你不期望外部看到它时,可以选择嵌套类。

类里面允许嵌套定义类,这样的类叫做内嵌类。

内嵌类同样受成员访问控制符影响,当你定义的内嵌类不会在类外部访问时,可以选择将其定义成private,这样,内嵌类型对外部不可见。

class enclose
{struct nested // private member{void g() {}};
public:static nested f() { return nested{}; }
};int main()
{//enclose::nested n1 = enclose::f(); // error: 'nested' is privateenclose::f().g();       // OK: does not name 'nested'auto n2 = enclose::f(); // OK: does not name 'nested'n2.g();
}

上面的这个例子在实际工程中不会这样干,因为既然将nested类定义为private,又何必提供一个公有的成员函数返回nested类型呢,虽语法可行,但显然违背初衷。

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
【PdgCntEditor】解... 一、问题背景 大部分的图书对应的PDF,目录中的页码并非PDF中直接索引的页码...
修复 爱普生 EPSON L4... L4151 L4153 L4156 L4158 L4163 L4165 L4166 L4168 L4...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...