C++编程法则100条关于内嵌类的使用细节
Posted 奇妙之二进制
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++编程法则100条关于内嵌类的使用细节相关的知识,希望对你有一定的参考价值。
🥇 关于博主👇🏻👇🏻👇🏻
👀 作者简介: 热衷于知识探索和分享的技术博主。
💂 csdn主页::【奇妙之二进制】
✍️ 微信公众号:【Linux 世界】🎉精彩专栏:
💪 【C++编程法则100条】
🎓 【面向工作git基础教程】
🧡 【C++11新特性深入剖析】
📚 【shell脚本编程基础与实战】
🌎 【Linux网络编程面试】
✍️ 【C++编译工具cmake入门到精通】
🤩 【Linux文本处理三剑客】
😉 【C++模板编程】
🥰 【VIM实用指南】
🔥 【Linux C/C++编译链接和调试调优】
✨ 【面向对象分析和设计】
🎉 【Ubuntu/Linux系统管理】
🤔 【C/C++笔面试精选】
✔️ 【Linux并发编程面试与实战】
🚀 【C/C++常用开源库实战】
😊 【Linux常用命令详解】
…💂关于作者: 曾就职于国内知名安防上市公司,现就职于国内知名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 members
int 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 instance
int 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 x
y = 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 declaration
class nested2; // forward declaration
class 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 private
enclose::f().g(); // OK: does not name 'nested'
auto n2 = enclose::f(); // OK: does not name 'nested'
n2.g();
上面的这个例子在实际工程中不会这样干,因为既然将nested类定义为private,又何必提供一个公有的成员函数返回nested类型呢,虽语法可行,但显然违背初衷。
以上是关于C++编程法则100条关于内嵌类的使用细节的主要内容,如果未能解决你的问题,请参考以下文章