C++从入门到精通——内部类和匿名类

news2024/11/20 3:26:07

内部类和匿名类

  • 前言
  • 一、内部类的概念
    • 示例
  • 二、内部类的特性
  • 三、匿名类的概念
    • 示例
  • 四、匿名类的特性
    • 总结


前言

内部类是定义在另一个类内部的类,它可以访问外部类的私有成员。匿名类是没有名字的类,通常用于一次性使用的简单对象创建,可以直接在需要使用的地方定义,并传递给其他方法。内部类和匿名类都是C++等编程语言的重要特性,它们可以简化代码结构,提高代码重用性。


一、内部类的概念

ps:可以安装友元类的定义来理解C++从入门到精通——友元

如果一个类定义在另一个类的内部,这个内部类就叫做内部类。内部类是一个独立的类,它不属于外部类,更不能通过外部类的对象去访问内部类的成员。外部类对内部类没有任何优越的访问权限。但是它可以访问外部类的私有成员,因为它被视为外部类的成员。内部类可以使用外部类的对象直接访问外部类的成员。内部类的定义可以在外部类的定义中或者在外部类的方法中,也可以在外部类的作用域之外定义。

内部类可以有自己的成员变量和成员函数,外部类可以使用内部类的对象访问内部类的成员。内部类的对象必须由外部类的对象来创建。

内部类可以在外部类的成员函数中访问外部类的私有成员,这样可以方便地实现封装和隐藏的特性。内部类还可以用于实现回调函数和迭代器等功能。

使用内部类可以提高代码的可读性和可维护性,因为内部类通常只在外部类中使用。此外,内部类还可以隐藏实现细节,提高代码的安全性。

注意:内部类就是外部类的友元类,参见友元类的定义,内部类可以通过外部类的对象参数来访问外部类中的所有成员。但是外部类不是内部类的友元。

示例

以下是一个使用内部类的C++示例:

#include <iostream>

class OuterClass {
private:
    int outerData;

public:
    class InnerClass {
    public:
        void displayData(OuterClass& outer) {
            std::cout << "Outer data: " << outer.outerData << std::endl;
        }
    };

    void setOuterData(int data) {
        outerData = data;
    }

    void useInnerClass() {
        InnerClass inner;
        inner.displayData(*this);
    }
};

int main() {
    OuterClass outer;
    outer.setOuterData(10);
    outer.useInnerClass();

    return 0;
}

在上面的示例中,我们定义了一个包含内部类的外部类OuterClassOuterClass拥有一个私有成员变量outerData。内部类InnerClass可以访问外部类的私有成员。

OuterClass的方法useInnerClass()中,我们创建一个InnerClass的实例inner,然后调用inner的方法displayData(),该方法接受OuterClass的引用作为参数并显示外部类的数据。

main()函数中,我们创建一个外部类的实例outer,然后调用setOuterData()来设置外部类的数据为10。接下来,我们调用useInnerClass()来使用内部类,并且输出外部类的数据。

运行上述代码将输出:

Outer data: 10

这个示例展示了内部类如何访问外部类的私有成员,并且如何使用内部类作为外部类的一部分来实现更清晰和封装的代码结构。

二、内部类的特性

特性:

  1. 内部类可以定义在外部类的publicprotectedprivate都是可以的。
  2. 注意内部类可以直接访问外部类中的static成员,不需要外部类的对象/类名。
  3. sizeof(外部类)=外部类,和内部类没有任何关系。
class A
{
private:
	static int k;
	int h;
public:
	class B // B天生就是A的友元
	{
	public:
		void foo(const A& a)
		{
			cout << k << endl;//OK
			cout << a.h << endl;//OK
		}
	};
};

int A::k = 1;

int main()
{
	A::B b;
	b.foo(A());

	return 0;
}

三、匿名类的概念

在 C++ 中,匿名类是一种没有命名的局部类,它与匿名类似,但在 C++ 中有一些区别。匿名类是在声明的同时进行实例化的,它可以作为对象在堆栈上分配并使用,也可以作为类成员使用。与匿名类不同,C++ 的匿名类可以定义自己的方法和成员变量。

匿名类的声明和实例化通常在代码块内部完成,使用的语法类似于在堆栈上创建对象。匿名类的定义和实例化通常在花括号内,与代码块的语法类似。

示例

下面是一个定义和使用匿名类的示例:

#include <iostream>

int main() {
  int num = 5;

  // 定义并实例化一个匿名类
  auto obj = [num]() {
    // 匿名类的成员变量
    int value = num;

    // 匿名类的成员方法
    void printValue() {
      std::cout << "Value: " << value << std::endl;
    }

    // 返回匿名类对象
    return *this;
  }();

  // 调用匿名类的成员方法
  obj.printValue();

  return 0;
}

在上面的示例中,我们使用 Lambda 表达式创建了一个匿名类,并在实例化时将 num 变量作为成员变量。然后,我们通过调用匿名类的成员方法来打印成员变量的值。

需要注意的是,C++ 中的匿名类只能在实例化时使用,无法在其他地方引用或复用。此外,匿名类的作用域仅限于声明它的代码块,超出该范围后将无法再使用。

四、匿名类的特性

C++匿名类具有以下特性:

  1. 没有类名:匿名类在声明时不需要提供类名,因此无法在其他地方引用或复用。它的作用域仅限于声明它的代码块。

  2. 可以定义成员变量和成员方法:在匿名类内部,可以定义自己的成员变量和成员方法。这些成员变量和成员方法仅在匿名类内部可见。

  3. 可以实例化为对象:匿名类可以在声明时进行实例化,就像在堆栈上创建一个对象一样。实例化后,可以使用该对象调用匿名类的成员方法或访问成员变量。

  4. 可以接受初始化参数:匿名类可以接受初始化参数,在实例化时传递给构造函数。可以使用 Lambda 表达式来定义匿名类,并在 Lambda 表达式内部使用捕获列表来传递初始化参数。

  5. 作用域限制:匿名类的作用域仅限于声明它的代码块。超出该范围后,无法再使用匿名类。

  6. 简化代码结构:匿名类可以用于简化代码结构,并提供一种在特定上下文中定义和使用临时类的方式。它可以用于一些需要局部定义的简单类情况,而无需单独为其创建一个命名类。

尽管匿名类具有一定的灵活性和便利性,但由于它的作用域和无法重用的特性,通常情况下更推荐使用命名类来组织和管理代码。匿名类更适用于一些临时、简单的特定场景下。

总结

  • 生命周期即在当前作用域下,即用即销毁
    在这里插入图片描述
  • 通过匿名对象可以简化代码在这里插入图片描述
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1609900.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ubuntu20.04安装+ros-noetic安装+内网穿透frp

刷机后的系统安装 ubuntu20.04安装安装ros-noetic安装各种必要的插件安装vscode内网穿透连接实验室主机配置frpc和frps文件运行完成自动化部署免密登录linux的免密登录windows上的免密登录 内网穿透的参考链接&#xff1a;如何优雅地访问远程主机&#xff1f;SSH与frp内网穿透配…

【刷题篇】回溯算法(五)

文章目录 1、N皇后2、有效的数独3、解数独4、单词搜索5、黄金矿工 1、N皇后 按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你…

Android自带模拟器如何获得ROOT权限

如果在模拟器中不能切换到root权限&#xff0c;很可能是镜像使用的不对。 一.选择镜像标准&#xff1a; 1.运行在PC端选X86_64镜像&#xff0c;才能流畅运行 2.不带google api的镜像 二.步骤 在虚拟机管理器中新建AVD&#xff0c;并下载符合要求的镜像文件 三.验证

【多线程学习】深入探究阻塞队列与生产者消费者模型和线程池常见面试题

˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好&#xff0c;我是xiaoxie.希望你看完之后,有不足之处请多多谅解&#xff0c;让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN 如…

中医药性笔记

目录 当归黄芪党参白术甘草茯苓半夏陈皮 当归 补血。 当归&#xff0c;腾讯医典 黄芪 土金之药。 补中气的同时补肺气。益卫固表、利水消肿、 腾讯医典黄芪 党参 土金之药。健脾益肺&#xff0c;生津养血。 党参补气之力弱于人参、用于脾肺气虚的轻症。 党参、腾讯…

全网最新的迅雷网盘拉新流程一览,碎片时间就能做的副业

有没有想做副业&#xff0c;又担心休息时间不够的朋友&#xff1f;有没有既想增加收入又不希望工作太累的朋友&#xff1f;如果你也有以上顾虑&#xff0c;不用担心&#xff0c;这个近几年的热门副业——迅雷网盘拉新项目就非常适合你&#xff01;网盘拉新是平台为了扩大用户群…

【python】一文搞懂序列、列表、元组、集合、字典区别及其应用

【python】一文搞懂序列、列表、元组、集合、字典区别及其应用 【先赞后看养成习惯】求点赞+关注+收藏😀 序列介绍 1、定义:序列(sequence)是一种可迭代的、元素有序的容器类型的数据。 2、序列包括列表(list)、字符串(str)、元组(tuple)和字节序列(bytes)等。 …

Liunx挂载硬件设备

一、mount命令&#xff08;用于挂载文件系统&#xff09; &#xff08;一&#xff09;语法格式&#xff1a;mount 参数 源设备路径 目的路径 &#xff08;二&#xff09;参数 1、-t&#xff1a;指定挂载的文件系统 &#xff08;1&#xff09;iso9660&#xff1a;光盘或光盘…

[vapkg]解决vcpkg下载缓慢的问题

在我们执行vcpkg install some_project之后&#xff0c;我们经常会遇见界面停留在Downloading某个依赖上面&#xff0c;这时我们可以直接把那个下载链接复制下来&#xff0c;然后在外面用浏览器或别的下载工具自己下载&#xff0c;接着&#xff0c;去\vcpkg\downloads\temp这个…

iOS开发 刻度盘 仪表盘,圆点按钮滑动控制,渐变色

最近项目需要&#xff0c;想做一个渐变色的刻度盘&#xff0c;圆形按钮滑动控制&#xff0c;所以 用oc写了一下&#xff0c;代码没附上&#xff0c;想看代码可以私信联系&#xff0c;效果如下图。 部分代码 self.drawCenter CGPointMake(self.frame.size.width / 2.0, self.f…

[大模型]TransNormerLLM-7B 接入 LangChain 搭建知识库助手

TransNormerLLM-7B 接入 LangChain 搭建知识库助手 环境准备 在 autodl 平台中租赁一个 3090/4090 等 24G 显存的显卡机器&#xff0c;如下图所示镜像选择 PyTorch–>2.0.0–>3.8(ubuntu20.04)–>11.8 接下来打开刚刚租用服务器的 JupyterLab&#xff0c;并且打开其…

Spark Standalone模式部署

准备至少2台虚拟机&#xff0c;装好linux系统&#xff0c;我装的是Ubuntu20.04。 1.修改主机名&#xff08;每台&#xff09; 1&#xff09;修改/etc/hostsname内容&#xff0c;主节点改为master&#xff0c;子节点改为slaver1 sudo vim /etc/hostname 2&#xff09;在/etc/…

rabbitmq 使用SAC队列实现顺序消息

rabbitmq 使用SAC队列实现顺序消息 前提 SAC: single active consumer, 是指如果有多个实例&#xff0c;只允许其中一个实例消费&#xff0c;其他实例为空闲 目的 实现消息顺序消费&#xff0c;操作&#xff1a; 创建4个SAC队列,消息的路由key 取队列个数模&#xff0c;这…

Marin说PCB之Via 的 Z--AXIS--delay知多少?

周末宅在家刷抖音的时候&#xff0c;看刷到了一条很有趣味的视频&#xff0c;主要讲的是让你如何从一个allegro菜鸟一个月变成大神的&#xff0c;一个月包教会&#xff0c;这不是妥妥地大骗子嘛。现在的整个市场行情不好啊&#xff0c;各大汽车新能源门派都在紧锣密鼓地搞着“裁…

AI预测福彩3D第40弹【2024年4月19日预测--第8套算法开始计算第8次测试】

今天咱们继续测试第8套算法和模型&#xff0c;今天是第8次测试&#xff0c;目前的测试只是为了记录和验证&#xff0c;为后续的模型修改和参数调整做铺垫&#xff0c;所以暂时不建议大家盲目跟买~废话不多说了&#xff0c;直接上结果&#xff01; 2024年4月19日3D的七码预测结果…

最小生成树算法的实现c++

最小生成树算法的实现c 题目链接&#xff1a;1584. 连接所有点的最小费用 - 力扣&#xff08;LeetCode&#xff09; 主要思路&#xff1a;使用krusal算法&#xff0c;将边的权值进行排序&#xff08;从小到大排序&#xff09;&#xff0c;每次将权值最小且未加入到连通分量中…

施耐德 PLC 及模块 ModbusTCP 通信配置方法

1. 通过【I/O扫描器】服务进行读写 相关文档&#xff1a;各模块说明书仅 NOE 网卡模块、部分 CPU 自带的网口支持 优点&#xff1a;不需要额外编程&#xff0c;系统自动周期型读写数据缺点&#xff1a;扫描周期不定&#xff0c;程序无法控制数据刷新的时序 2. 通过内部程序…

C语言---贪吃蛇(一)---准备工作

文章目录 前言1.Win32 API介绍1.1.Win32 API1.2. 控制台程序1.3.控制台屏幕上的坐标[COORD](https://learn.microsoft.com/zh-cn/windows/console/coord-str)1.4.[GetStdHandle](https://learn.microsoft.com/zh-cn/windows/console/getstdhandle)1.5.[GetConsoleCursorInfo](h…

Navicat 干货 | 了解 PostgreSQL 规则

PostgreSQL 是一个强大的开源关系型数据库管理系统&#xff0c;为增强数据管理和操作提供了丰富的功能。这些功能中包含了规则&#xff0c;这是一种用于控制数据库内部查询和命令处理方式的机制。本文将探讨 PostgreSQL 规则的工作原理&#xff0c;以及它们与触发器的区别&…

替代普通塑料吸头的PFA移液吸头

目前市场上的规格&#xff1a;0.01ml、0.05ml、0.1ml、0.2ml、0.5ml、1ml、2ml、5ml、10ml等均可定制加工PFA材质枪头&#xff0c;可以适配市场上大部分移液枪&#xff0c;普兰德&#xff0c;大龙&#xff0c;赛默飞&#xff0c;赛多利斯&#xff0c;力辰、吉尔森&#xff0c;瑞…