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

Posted thefist11

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ Primer 5th笔记(chap 19 特殊工具与技术)嵌套类相关的知识,希望对你有一定的参考价值。

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) ;//没有找到
	else
	   return QueryResult(sought, loc->second, file);
}

以上是关于C++ Primer 5th笔记(chap 19 特殊工具与技术)嵌套类的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

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

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

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