38、C++ Primer 4th笔记,特殊工具与技术,嵌套类

简介: 1、在一个类内部再定义另外一个类,这样的类称为嵌套类(nested class),也称为嵌套类型(nested type)。嵌套类最常用于执行类。 嵌套类是独立的类,基本上与它们的外围类不相关,因此,外围类和嵌套类的对象是互相独立的。

1、在一个类内部再定义另外一个类,这样的类称为嵌套类(nested class),也称为嵌套类型(nested type)。嵌套类最常用于执行类。

嵌套类是独立的类,基本上与它们的外围类不相关,因此,外围类和嵌套类的对象是互相独立的。嵌套类型的对象不具备外围类所定义的成员,同样,外围类的成员也不具备嵌套类所定义的成员。

示例代码

template <class Type> 
class Queue
{
	//interface functions to Queue are unchanged
private:
	//public members are ok: QueueItem is a private member of Queue
	// only Queue and its friends may access the members of QueueItem
	struct QueueItem
	{
		QueueItem(const Type&);
		Type Item; // value stored in this element
		QueueItem *next; // pointer to next element in the Queue
	};
	QueueItem *head; // pointer to first element in Queue
	QueueItem *tail; // pointer to last element in Queue
};

template <class Type>
Queue<Type>::QueueItem::QueueItem(const Type &t):Item(t), next(0)
{

}

2、嵌套在类模板内部的类是模板。嵌套类模板的实例化与外围类模板的实例化之间的映射是一对一的。

在其类外部定义的嵌套类成员,必须定义在定义外围类的同一作用域中。在基类外部定义的嵌套类的成员,不能定义在外围类内部,嵌套类的成员不是外围类的成员。

示例代码

#include <iostream>
using namespace std;

template <class Type> 
class Queue
{
	//interface functions to Queue are unchanged
public:
	void Pop();
private:
	//public members are ok: QueueItem is a private member of Queue
	// only Queue and its friends may access the members of QueueItem
	struct QueueItem;
	QueueItem *head; // pointer to first element in Queue
	QueueItem *tail; // pointer to last element in Queue
};

template <class Type>
struct Queue<Type>::QueueItem
{
	QueueItem(const Type&): Item(t), next(0){};
	Type Item; // value stored in this element
	QueueItem *next; // pointer to next element in the Queue
	static int static_mem;
};

template <class Type>
int Queue<Type>::QueueItem::static_mem = 1024;

template <class Type>
void Queue<Type>::Pop()
{
	QueueItem *p = head;
	head = head->next;
	delete p;
}

int main()
{
	return 1;
}

    从右至左读函数的名字。

3、正如可以在类定义体外部定义嵌套类的成员一样,我们也可以在外围类定义体的外部定义整个嵌套类。

4、如果嵌套类声明了一个静态成员,它的定义也需要放在外层作用域中。

5、外围作用域的对象与嵌套类型的对象之间没有联系。

    嵌套类中的非静态函数具有隐含的this指针,指向嵌套类型的对象。嵌套类型对象只包含嵌套类型的成员,不能使用this指针获取外围类的成员。同样,外围类中的非静态成员函数也具有this指针,它指向外围类型的对象,该对象只具有外围类中定义的成员。

6嵌套类可以直接引用外围类的静态成员、类型名和枚举成员。引用外围作用域之外的类型名或静态成员,需要作用域确定操作符。

7、实例化外围类模板的时候,不会自动实例化类模板内的嵌套类。像成员函数一样,只有当在需要完整类类型的情况下使用嵌套类本身的时候,才会实例化嵌套类。上述例子中,Queue<int> qi; 只实例化Queue<int>但是并不实例QueueItem<int>,只有在Queue<int>类的成员函数中对head,tail解引用时,才实例化QueueItem<int>类。

8、对嵌套类中所用名字的名字查找,在普通类的名字查找之前进行。当处理类成员声明的时候,所用的任意名字必须在使用之前出现。当处理定义的时候,整个嵌套类和外围类都在作用域中。

目录
相关文章
|
存储 算法 C++
C++提高篇:泛型编程和STL技术详解,探讨C++更深层的使用
文章详细探讨了C++中的泛型编程与STL技术,重点讲解了如何使用模板来创建通用的函数和类,以及模板在提高代码复用性和灵活性方面的作用。
333 2
C++提高篇:泛型编程和STL技术详解,探讨C++更深层的使用
|
人工智能 Anolis
聚焦C++20 最新标准!技术 Workshop 精彩亮点一览 | 2024 龙蜥大会
多场技术 Workshop、多位领域专家亲自授课,分享独家洞察与宝贵经验。
|
C++ 容器
【C/C++笔记】迭代器
【C/C++笔记】迭代器
366 1
|
C++ Windows
FFmpeg开发笔记(三十九)给Visual Studio的C++工程集成FFmpeg
在Windows上使用Visual Studio 2022进行FFmpeg和SDL2集成开发,首先安装FFmpeg至E:\msys64\usr\local\ffmpeg,然后新建C++控制台项目。在项目属性中,添加FFmpeg和SDL2的头文件及库文件目录。接着配置链接器的附加依赖项,包括多个FFmpeg及SDL2的lib文件。在代码中引入FFmpeg的`av_log`函数输出"Hello World",编译并运行,若看到"Hello World",即表示集成成功。详细步骤可参考《FFmpeg开发实战:从零基础到短视频上线》。
1262 0
FFmpeg开发笔记(三十九)给Visual Studio的C++工程集成FFmpeg
HTML+JavaScript构建一个将C/C++定义的ANSI字符串转换为MASM32定义的DWUniCode字符串的工具
HTML+JavaScript构建一个将C/C++定义的ANSI字符串转换为MASM32定义的DWUniCode字符串的工具
|
算法 C# 开发工具
《黑神话:悟空》背后的编程语言揭秘——超越C++的多元技术融合
【8月更文挑战第27天】在游戏开发领域,一款游戏的成功往往离不开其背后强大的技术支持和编程语言的精妙运用。《黑神话:悟空》作为备受瞩目的国产单机动作游戏,其开发过程不仅涉及了多种编程语言,更是一次技术创新的集中展现。然而,当我们深入探讨其开发语言时,会发现它并非仅依赖于单一的C++,而是融合了多种编程语言的优势,共同铸就了这款游戏的辉煌。
987 0
|
存储 安全 程序员
【C/C++笔记】迭代器范围
【C/C++笔记】迭代器范围
375 0
|
编译器 C++ 开发者
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。
|
编译器 C++ 容器
【c++11】c++11新特性(上)(列表初始化、右值引用和移动语义、类的新默认成员函数、lambda表达式)
C++11为C++带来了革命性变化,引入了列表初始化、右值引用、移动语义、类的新默认成员函数和lambda表达式等特性。列表初始化统一了对象初始化方式,initializer_list简化了容器多元素初始化;右值引用和移动语义优化了资源管理,减少拷贝开销;类新增移动构造和移动赋值函数提升性能;lambda表达式提供匿名函数对象,增强代码简洁性和灵活性。这些特性共同推动了现代C++编程的发展,提升了开发效率与程序性能。
619 12