1. 嵌套类( nested class)或嵌套类型( nested type )

一个类可以定义在另一个类的内部,这个类常用于定义作为实现部分的类。

class TextQuery {public:class QueryResult;   // 嵌套类稍后定义
}// QueryResult是TextQuery的成员
class TextQuery::QueryResult {// 位于类的作用域内, 因此我们不必对QueryResult形参进行限定friend std::ostream& print(std::ostream&, const QueryResult&);
public:// 嵌套类可以直接使用外层类的成员, 无须对该名字进行限定QueryResult(std::string, std::shared_ptr<std::set<line_no>>,std::shared_ptr<std::vector<std::string>>);
};

1.1 相互独立

嵌套类是一个独立的类, 与外层类基本没什么关系。嵌套类也使用访问限定符来控制外界对其成员的访问权限。

  • 外层类对嵌套类的成员没有特殊的访问权限, 同样, 嵌套类对外层类的成员也没有特殊的访问权限。
  • 嵌套类的对象只包含嵌套类定义的成员; 同样, 外层类的对象只包含外层类定义的成员, 在外层类对象中不会有任何嵌套类的成员

1.2 作用域

嵌套类的名字在外层类作用域中是可见的, 在外层类作用域之外不可见。

  • 嵌套类的名字不会和别的作用域中的同一个名字冲突。
  • 嵌套类中成员的种类与非嵌套类是一样的。

位于外层类 protected 部分的嵌套类定义的类型只能被外层类及其友元和派生类访问
位于外层类private 部分的嵌套类定义的类型只能被外层类的成员和友元访问

1.3 定义嵌套类的成员

TextQuery::QueryResult::QueryResult(string s, shared_ptr<set<line_no>> p,std::shared_ptr<std::vector<std::string>> f) :sought(s), lines(p), file(f) { }

1.4 嵌套类的静态成员定义

如果 QueryResult 声明了一个静态成员, 则该成员的定义将位于 TextQuery 的作用域之外。 例如, 假设 QueryResult 有一个静态成员, 则该成员的定义将形如:

// QueryResult 类嵌套在 TextQuery 类中,
// 下面的代码为 QueryResult 定义一个静态成员
int TextQuery::QueryResult::static mem = 1 0 2 4;

1.5 嵌套类作用域中的名字查找

嵌套类是其外层类的一个类型成员, 因此外层类的成员可以像使用任何其他类型成员一样使用嵌套类的名字。

//返回类型必须指明 QueryResult 是一个嵌套类
TextQuery::QueryResult TextQuery::query (const string Ssought ) const
{//如果我们没有找到sought, 则返回set的指针static shared _ptr<set<line_no» nodata (new set<line_no>) ;//使用find而非下标以避免向 wm 中添加单词auto loc = wm.find(sought) ;if (loc wm.end())return QueryResult(sought, nodata, file) ;//没有找到elsereturn QueryResult(sought, loc->second, file);
}

C++ Primer 5th笔记(chap 19 特殊工具与技术)嵌套类相关推荐

  1. C++ Primer 5th笔记(chap 19 特殊工具与技术)类成员指针

    1. 成员指针( pointer to member) 指可以指向类的非静态成员的指针. 成员指针指示的是类的成员, 而非类的对象. 类的静态成员不属于任何对象, 因此无须特殊的指向静态成员的指针 指 ...

  2. C++ Primer 5th笔记(chap 19 特殊工具与技术)异常类层次

    1. 类 exception . bad_cast 和 bad_alloc 定 义 了 默 认 构 造 函 数 runtime_error 和 logic_error没有默认构造函数, 但是有一个可以 ...

  3. C++ Primer 5th笔记(chap 19 特殊工具与技术)typeid运算符

    1. typeid运算符(typeid operator) 它允许程序向表达式提问:你的对象是什么类型? typeid表达式的形式是typeid(e),其中e可以是任意表达式或类型的名字,它操作的结果 ...

  4. C++ Primer 5th笔记(chap 19 特殊工具与技术)运行时类型识別RTTI

    1. 运行时类型识别(run-time type identification ) 当我们将这两个运算符用于某种类型的指针或引用, 并且该类型含有虚函数时, 运算符将 使用指针或引用所绑定对象的动态类 ...

  5. C++ Primer 5th笔记(chap 19 特殊工具与技术)type_info 类

    1. type_info 的操作 操作 描述 t1 == t2 如果type_info对象t1和t2表示同一种类型,则返回true t1 != t2 如果type_info对象t1和t2表示不同的类型 ...

  6. C++ Primer 5th笔记(chap 19 特殊工具与技术)typeid

    1. 通常情况下使用 typeid 比较两条表达式的类型是否相同或者比较一条表达式的类型是否与指定的类型相同 Derived *dp = new Derived; Base *bp = dp; // ...

  7. C++ Primer 5th笔记(chap 19 特殊工具与技术)使用 RTTI

    1. RTTI用处 当想为具有继承关系的类实现相等运算符时.对于两个对象来说,如果他们的类型相同并且对应的数据成员取值相同,则我们说这两个类是相等的. class Base {friend bool ...

  8. C++ Primer 5th笔记(chap 19 特殊工具与技术)定位 new 表达式

    1. 定位 new (placement new) 1.1 起因 内存分配和初始化分离开 Placement new allows you to construct an object in memo ...

  9. C++ Primer 5th笔记(chap 19 特殊工具与技术)malloc 函数与 free 函数

    void *operator new (size_t size) {if (void *mem = malloc (size) )return mem;elsethrow bad_alloc ( ); ...

  10. C++ Primer 5th笔记(chap 19 特殊工具与技术)控制内存分配

    1. new void operator new (size_t, void ) ;//不允许重新定义这个版本 string *sp = new string("a value") ...

最新文章

  1. 用shell脚本配置oracle安装需求
  2. 一些Java面试技巧分享,你不能错过!
  3. python嵌入到qt_在Qt图形用户界面中嵌入绘图
  4. 项目部署时,linux环境配置问题
  5. Expression Studio简体中文正式版+序列号.
  6. docker命令易错点整理
  7. jQuery中iframe的操作
  8. 【原创】字典攻击教务处(BurpSuite使用)
  9. RGMII通信接口详述
  10. 拉勾网爬取失败?试试这一招
  11. 风之大陆 服务器不稳定,【风之大陆】7月29日更新公告
  12. 用JSP-Servlet构建三层式管理信息系统
  13. 纯JavaScript二维码在线生成网页源码
  14. Ubuntu 18.04更改用户名
  15. 珞珈一号全国一张图相关信息及对于影像校正的一些思考
  16. cuda矩阵相乘_CUDA计算矩阵相乘
  17. h5-浏览器点击跳转微信小程序或微信内部广告页(微信浏览器)跳转小程序的实现方法。
  18. poky raspbian开发教程
  19. PRes 语言常用参考
  20. [Python 高德地图] API调用学习历程(四)

热门文章

  1. 计算机主板的1117标识,电脑出现:错误1117.......截图如下,
  2. 模块化是数据中心设计的未来
  3. 因误开 IDC 灭火器,导致 Azure 在欧洲罢工超过 7 小时!
  4. mysql mysqlhotcopy_MySQL备份工具之mysqlhotcopy
  5. ML:MLOps系列讲解之《MLOps的State(工具和框架)》解读
  6. 成功解决ModuleNotFoundError: No module named ‘sklearn.cross_validation‘
  7. Py之playsound:playsound的简介、安装、使用方法之详细攻略
  8. Py之gensim:gensim的简介、安装、使用方法之详细攻略
  9. 成功解决 _mssql.c(568): fatal error C1083: 无法打开包括文件: “sqlfront.h”: No such file or directory
  10. 成功解决当Win10系统进行深度学习的时候发现系统C盘满了,教你如何正确卸载一些非必要的内容