C++初阶语法——内部类

news/2024/12/4 23:14:15/

前言:内部类,顾名思义是定义在类中的类,许多人会以为它属于外部的类,实际上并不是,它们是两个独立的类,但是内部类受外部类类域的限制。

目录

  • 一.概念
  • 二.特性
    • 1.内部类和外部类相互独立
    • 2.内部类是外部类的友元类
  • 三.举例

一.概念

如果一个类定义在另一个类的内部,这个类就叫做内部类。但是内部类是一个独立的类,它不属于外部的类,更不能通过外部类的对象去访问内部类的成员。外部类对内部类没有任何优越的访问权限。

class A {
public:class B {private:int _b = 2;};
private:int _a = 1;
};int main()
{A aa; //A类实例化对象aa//B bb; //报错,B类受A类类域限制A::B bb; //B类实例化对象bbreturn 0;
}

二.特性

1.内部类可以定义在外部类的public,protected,private都是可以的。
2.注意内部类可以直接访问外部类中的static成员,不需要外部类的对象/类名。
3.sizeof(外部类) = 外部类,和内部类没有任何关系,证明了它们是两个独立的类
4。内部类是外部类的友元类,因而内部类可以通过外部类的对象参数来访问外部类中的所有成员,但是外部类不是内部类的友元。

1.内部类和外部类相互独立

class A {
public:class B {private:int _b = 2;int _c = 3;};
private:int _a = 1;
};int main()
{cout << sizeof(A) << endl;cout << sizeof(A::B) << endl;return 0;
}

控制台输出如下:
在这里插入图片描述
可以看到,B为A的内部类,但是A的内存为4个字节,B的内存为8个字节。说明A和B是独立的类。

2.内部类是外部类的友元类

class A {
public:class B {publicvoid FuncB(){A aa; // 在B类中调用A类aa._a = 2; //访问A类成员变量}private:int _b = 2;};void FuncA() {B bb;// bb._b = 2; A不是B的友元类,不能通过B对象参数访问B中成员}
private:int _a = 1;
};

在这里插入图片描述

三.举例

以牛客网的一个题目(超链接)为例,展示内部类的用处:
在这里插入图片描述

题解:

涉及知识点:构造函数,静态成员,内部类

class Solution {class sum{public:sum()  //构造函数{  _ret += _tmp;_tmp++;}};
public:int Sum_Solution(int n) {sum arr[n];return _ret;}static int _ret; //静态成员变量static int _tmp;
};
int Solution::_ret = 0; //静态成员变量在类外定义初始化
int Solution::_tmp = 1;

文末BB:对哪里有问题的朋友,尽管在评论区留言,若哪里写的有问题,也欢迎朋友们在评论区指出,博主看到后会第一时间确定修改。最后,制作不易,如果对朋友们有帮助的话,希望能给博主点点赞和关注.
在这里插入图片描述


http://www.ppmy.cn/news/1042104.html

相关文章

Web菜鸟入门教程 - MyBatis通过数据库生成java代码

SpringBoot大大简化了Web开发流程。可以这么说&#xff0c;做Web后来开发大部分时间就是在做配置文件修改。Web开发中&#xff0c;终端的运算能力越来越强&#xff0c;大部分场景就是数据库的操作&#xff0c;只有少部分逻辑会放在Web端处理。而这些增删查改基本属于标准的格式…

CFD特性FPmarkets澳福认为了解这11种足够了

CFD在交易中很重要&#xff0c;但CFD特性很多投资者不了解&#xff0c;FPmarkets澳福认为了解这11种足够了&#xff1a; 1. 投资者通过标的资产价格价值的变化获利&#xff0c;而不拥有标的资产。 2. 差价合约交易没有固定的到期日。 3. 与期货交易类似&#xff0c;差价合约交易…

Window下部署使用Stable Diffusion AI开源项目绘图

Window下部署使用Stable Diffusion AI开源项目绘图 前言前提条件相关介绍Stable Diffusion AI绘图下载项目环境要求环境下载运行项目打开网址&#xff0c;即可体验文字生成图像&#xff08;txt2img&#xff09;庐山瀑布 参考 本文里面的风景图&#xff0c;均由Stable Diffusion…

基于golang实现telnet远程登录并发送命令源代码实现

//文件命名为main.go //package mainimport ("fmt""net""os""strconv""strings""time" )const WILL 251 const WONT 252 const DO 253 const DONT 254 const IAC 255 const RD 1 const SGA 3func main() {…

环形链表笔记(自用)

环形链表 不管怎么样slow最多走半圈了&#xff0c; 快慢指针slow走一步&#xff0c;fast走两步最合适&#xff0c;因为假设fast和slow相差n每一次他们前进&#xff0c;就会相差n-1步&#xff0c;这样他们一定会相遇&#xff0c;如果是环形链表的话。 代码 /*** Definition for…

eNSP:VLAN-hybrid实验应用

实验要求&#xff1a; 拓扑图 配置 sw1: [sw1]vlan batch 2 to 6[sw1]int Ethernet 0/0/2 [sw1-Ethernet0/0/2]port link-type access [sw1-Ethernet0/0/2]port default vlan 2 [sw1-Ethernet0/0/2]int e 0/0/4 [sw1-Ethernet0/0/4]port link-ty access [sw1-Ethernet0/0/…

ld链接文件和startup文件分析和优化--基于RT1176

ld链接文件关系到程序的代码段数据段bss段及其用户自定义段的运行位置&#xff0c;ld文件中的各个段都会在main函数之前&#xff0c;从加载域拷贝到运行域中。本章将具体介绍如何修改ld和startup文件。 软件平台&#xff1a;VSCODEGCC工具链 硬件平台&#xff1a;rt1176开发板…

第一章 初识Linux(含VMware安装Ubuntu、CentOS、Windows、FinalShell、快照)

目录 一、 课程的介绍  1.为什么要学习Linux  2.课程的安排  3.如何学习Linux 二、操作系统概述  1.学习目标  2.计算机的硬件和软件  3.什么是操作系统  4.常见的操作系统  5.本小节的总结 三、初识Linux  1.学习目标  2.Linux的诞生  3.Linux的内核  …