当前位置: 首页 > news >正文

类和对象——const修饰的类的对象和函数

const修饰的类的对象和函数

  • const成员函数和const对象
    • 1 const成员函数
    • 2 调用关系
    • 3 const在成员函数中的位置
    • 4 取地址&及const取地址操作符重载

const成员函数和const对象

1 const成员函数

const修饰的“成员函数”称之为const成员函数,const修饰类成员函数,实际修饰该成员函数隐含的this指针,表明在该成员函数中不能对类的任何成员进行修改
请添加图片描述
例如:

#include<iostream>
class Date {
public:Date(int year, int month, int day) {_year = year;_month = month;_day = day;}//编译器认为两个Print构成函数重载void Print() {using std::cout;using std::endl;cout << "Print()" << endl;cout << "year:" << _year << endl;cout << "month:" << _month << endl;cout << "day:" << _day << endl << endl;}void Print() const {using std::cout;using std::endl;cout << "Print()const" << endl;cout << "year:" << _year << endl;cout << "month:" << _month << endl;cout << "day:" << _day << endl << endl;}
private:int _year; // 年int _month; // 月int _day; // 日
};
int main() {Date d1(2022, 1, 13);d1.Print();const Date d2(2022, 1, 13);//编译器认为d2.Print(&d2),&d2的类型是const Date*,//会为d2匹配void Print() constd2.Print();return 0;
}

编译器的原则:永远是最匹配的,没有就找最合适的。权限可以缩小,但不可以放大。所以d1调用的是Print(),而d2调用的是Print() const

如果只有Print() const,则d1调用的是Print() const。例如:

#include<iostream>class Date {
public:Date(int year, int month, int day) {_year = year;_month = month;_day = day;}void Print() const {using std::cout;using std::endl;cout << "Print()const" << endl;cout << "year:" << _year << endl;cout << "month:" << _month << endl;cout << "day:" << _day << endl << endl;}
private:int _year; // 年int _month; // 月int _day; // 日
};int main() {Date d1(2022, 1, 13);d1.Print();return 0;
}

2 调用关系

const对象和const成员函数,它们与非const的对象和成员函数之间的关系:

  1. const对象不可以调用非const成员函数。权限放大。

因为非const成员函数可通过this指针间接修改对象,所以const对象不能将自身具有常属性的地址上传给this指针,防止权限放大。

参考样例:

#include<iostream>
class A {
public:void f1() {using std::cout;cout << "void f1()\n";}void f2() const {using std::cout;cout << "void f2()\n";}
};int main() {const A a;//a.f1();//不允许。a.f2();//允许,权限平移return 0;
}
  1. const对象可以调用const成员函数。权限缩小。
#include<iostream>
class A {
public:void f1() {using std::cout;cout << "void f1()\n";}void f2() const {using std::cout;cout << "void f2()\n";}
};int main() {A a;a.f2();//允许return 0;
}
  1. const成员函数内不可以调用其它的非const成员函数。
    因为const成员函数的this具有常属性,将this的值上传给非const成员函数,因为非const的成员函数不具有常属性的this,所以权限放大。
#include<iostream>
class A {
public:void f1() {using std::cout;cout << "void f1()\n";}void f2() const {using std::cout;cout << "void f2()\n";//f1();//不允许,权限放大}
};

在存在大量代码复用的类中需要特别注意。

  1. const成员函数内可以调用其它的const成员函数。权限缩小。
#include<iostream>
class A {
public:void f1() {using std::cout;cout << "void f1()\n";f2();//可以,权限缩小。}void f2() const {using std::cout;cout << "void f2()\n";}
};

3 const在成员函数中的位置

这是一个数组类:

#include<iostream>
#include<cstdlib>
class SeqList {
public:~SeqList() {free(a);}int& operator[](int i) const {//a向堆区申请内存,出了这里的作用域数据还在,可以传引用返回return a[i];}
private://c++11允许给内置类型成员初始值,甚至是调用公共库函数//但如果函数执行出错无法反馈int* a = (int*)malloc(sizeof(int) * 10);size_t size = 0;size_t capacity = 10;
};void print(const SeqList& a) {using std::cout;for (int i = 0; i < 10; i++) {cout << a[i] << ' ';a[i]++;//const只限制a本身的内容不可改变,}cout << "\n";
}int main() {SeqList a;using std::cout;for (int i = 0; i < 10; i++)a[i] = i;//修改堆区的数据print(a);print(a);return 0;
}

函数int& operator[](int i) const{}虽然对this指针本身用const修饰,但是函数返回值是堆区某个位置的引用,所以[]并没有对堆区的数据进行限制。

数组类需要通过[]进行修改和访问数据,因此在部分场合我们想通过[]修改数据,在另一场合又希望这个数据无法被修改。

所以需要提供两个[]的重载,一个只读,一个可读可写,此时编译器会匹配最合适的[]。只读的[]重载一般需要用两个const进行限制。

#include<iostream>
#include<cstdlib>
class SeqList {
public:~SeqList() {free(a);}int& operator[](int i) {//对象可读可写return a[i];}const int& operator[](int i) const{//对象只读return a[i];}
private:int* a = (int*)malloc(sizeof(int) * 10);size_t size = 0;size_t capacity = 10;
};void print(const SeqList& a) {using std::cout;for (int i = 0; i < 10; i++) {cout << a[i] << ' ';//a[i]++;//编译器为const SeqList匹配形参为const SeqList的operator[],所以不可修改}cout << "\n";
}int main() {SeqList a;using std::cout;for (int i = 0; i < 10; i++)a[i] = i;//修改堆区的数据print(a);return 0;
}

还是需求问题,程序员想要用户不修改什么数据,就加const对类的成员函数进行限制。

4 取地址&及const取地址操作符重载

默认成员函数的取地址&重载一般不用重新定义 ,编译器默认会生成。其中用到了const修饰this时构成的重载。

class Date {
public:Date* operator&() {return this;}const Date* operator&() const {//参考上文的数组类return this;}
private:int _year; // 年int _month; // 月int _day; // 日
};

这两个运算符一般不需要重载,使用编译器生成的默认取地址的重载即可,只有特殊情况,才需要重载,比如不想被别人取到对象的有效地址,于是给个假地址返回。

#ifndef _CRT_SECURE_NO_WARNINGS
#define _CRT_SECURE_NO_WARNINGS 1
#endif#include<iostream>
using std::cout;
class Date {
public:Date(int year=1900,int month=0,int day=0){_year = year;_month = month;_day = day;}Date* operator&() {return nullptr;}const Date* operator&() const {return nullptr;}
private:int _year; // 年int _month; // 月int _day; // 日
};int main() {Date a;const Date b;cout << (&a) << '\n' << (&b);return 0;
}

相关文章:

类和对象——const修饰的类的对象和函数

const修饰的类的对象和函数 const成员函数和const对象1 const成员函数2 调用关系3 const在成员函数中的位置4 取地址&及const取地址操作符重载 const成员函数和const对象 1 const成员函数 将const修饰的“成员函数”称之为const成员函数&#xff0c;const修饰类成员函数&…...

防火墙的智能选路与NAT实验

实验拓扑 配置IP 防火墙的安全区域划分 销售部和运维部不能互相访问&#xff0c;采取vlan的方式来进行隔离。 在配置vlan之后 &#xff0c;两个部门将不会通信。 以上是基础配置&#xff0c;只是演示在各个部门不通的情况下&#xff0c;使用什么技术来进行隔离网络&#xff0c;…...

ARM学习(43)armcc HardFault函数链接不到的问题理解

armcc HardFault函数链接不到的问题理解 1、问题背景&#xff1a; 笔者汇编语言编写了一个HardFault异常处理函数&#xff0c;HardFault函数属于芯片架构异常处理函数&#xff0c;没有显著的调用&#xff08;中断向量表中有该函数地址&#xff09;&#xff0c;且启动函数里面也…...

php序列化与反序列化

文章目录 基础知识魔术方法&#xff1a;在序列化和反序列化过程中自动调用的方法什么是 __destruct() 方法&#xff1f;何时触发 __destruct() 方法&#xff1f;用途&#xff1a;语法示例&#xff1a; 反序列化漏洞利用前提条件一些绕过策略绕过__wakeup函数绕过正则匹配绕过相…...

【STL】7.STL常用算法(2)

STL常用算法&#xff08;2&#xff09; 前言简介四.常用拷贝和替换算法1.copy2.replace3.replace_if4.swap 五.算术生成算法1.accumulate2.fill 六.常用集合算法1.set_intersection2.set_union3.set_difference 总结 前言 stl系列主要讲述有关stl的文章&#xff0c;使用STL可以…...

怎么获取免费的 GPU 资源完成大语言模型(LLM)实验

怎么获取免费的 GPU 资源完成大语言模型(LLM)实验 目录 怎么获取免费的 GPU 资源完成大语言模型(LLM)实验在线平台类Google ColabKaggle NotebooksHugging Face Spaces百度飞桨 AI Studio在线平台类 Google Colab 特点:由 Google 提供的基于云端的 Jupyter 笔记本环境,提…...

xr-frame 3D Marker识别,扬州古牌坊 3D识别技术稳定调研

目录 识别物体规范 3D Marker 识别目标文件 map 生成 生成任务状态解析 服务耗时&#xff1a; 对传入的视频有如下要求&#xff1a; 对传入的视频建议&#xff1a; 识别物体规范 为提高Marker质量&#xff0c;保证算法识别效果&#xff0c;可参考Marker规范文档 Marker规…...

盛京开源社区加入 GitCode,书写东北开源生态新篇章

在数字化转型与开源技术蓬勃发展的浪潮下&#xff0c;开源社区已成为推动技术创新的核心力量。盛京开源社区&#xff08;SJOSC&#xff09;作为沈阳地区的开源交流平台&#xff0c;始终致力于连接开发者、企业及高校&#xff0c;构建区域技术生态圈。 现在&#xff0c;盛京开源…...

【六祎 - Note】SQL备忘录;DDL,DML,DQL,DCL

SQL备忘录 from to : 点击访问源地址...

几个api

几个api 原型链 可以阅读此文 Function instanceof Object // true Object instanceof Function // true Object.prototype.isPrototypeOf(Function) // true Function.prototype.isPrototypeOf(Object) // true Object.__proto__ Function.prototype // true Function.pro…...

(转)Java单例模式(1)

l单例模式的好多&#xff1a;节约了内存&#xff0c;提高了代码的执行效率。...

return和print

目录 1.print的用法 2.return的用法 3. print 和 return 的区别 4.总结 1.print的用法 print 是一个函数&#xff0c;用于将信息输出到控制台&#xff08;终端&#xff09;。它主要用于显示程序运行的结果&#xff0c;方便用户查看。print 的作用是输出内容&#xff0c;而不…...

设计模式——过滤器模式在 Spring 中的实践

设计模式——过滤器模式在 Spring 中的实践 基础介绍模块介绍简单实现业务落地额外问题 基础介绍 过滤器模式&#xff08;Filter Pattern&#xff09;&#xff0c;也称为标准模式&#xff08;Criteria Pattern&#xff09;&#xff0c;是结构型设计模式之一&#xff0c;旨在通…...

15.7 LangChain 版智能销售顾问实战:构建企业级知识驱动型对话系统

LangChain 版智能销售顾问实战:构建企业级知识驱动型对话系统 关键词:LangChain 销售系统、知识图谱集成、对话状态管理、生产级部署、多链协同优化 1. LangChain 销售系统架构设计 1.1 模块化架构全景图 #mermaid-svg-42MLuD3aMcpX0y8c {font-family:"trebuchet ms&q…...

QT异步编程之线程池QThreadPool

一、概述 在一个应用程序中&#xff0c;我们需要多次使用线程&#xff0c;也就意味着&#xff0c;我们需要多次创建并销毁线程。而创建线程并销毁线程的过程势必会消耗内存。QThreadPool是Qt框架中用于管理线程池的类。它提供了一种高效的方式来管理和重用线程&#xff0c;从而…...

HTMLS基本结构及标签

HTML5是目前制作网页的核心技术&#xff0c;有叫超文本标记语言。 基本结构 声明部分位于文档的最前面&#xff0c;用于向浏览器说明当前文档使用HTML标准规范。 根部标签位于声明部分后&#xff0c;用于告知浏览器这是一个HTML文档。< html>表示文档开始&#xff0c;&l…...

linux(2)用户管理

文章目录 1. 切换用户2. 添加删除用户3.写改密码 1. 切换用户 # 切换用户名&#xff0c;不切换工作目录 su 用户名 # 一起切换工作目录 su - 用户名 # 退出用户 exit2. 添加删除用户 # 添加用户 sudo adduser username # 推荐sudo useradd -m -s /bin/bash 用户名-m 如果创建…...

蓝桥杯好题推荐----高精度乘法

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 题目链接 P1303 A*B Problem - 洛谷https://www.luogu.com.cn/problem/P1303 解题思路 这道题的思路&#xff0c;其实和前面差不多&#xff0c;我们主要说一下最为关键的部分&…...

辛格迪客户案例 | 甫康(上海)健康科技有限责任公司药物警戒管理系统(PVS)项目

01 案例企业 甫康(上海)健康科技有限责任公司&#xff08;简称“甫康”&#xff09;该公司成立于2015年11月3日。公司的核心团队由来自中国和国外顶级制药公司的专业人士组成&#xff0c;与中国科学院上海药物研究所等知名研究机构保持紧密合作。此外&#xff0c;甫康药业还与…...

【Java】System 类

目录 静态字段标准输入输出流相关 常用静态方法数组操作时间操作系统操作属性操作安全管理 其他方法 System 类位于 java.lang 包下&#xff0c;是一个 final 类&#xff0c;意味着它不能被继承。并且其所有构造方法都是私有的&#xff0c;这使得我们无法创建 System 类的实例&…...

认识苹果APP开发框架

苹果APP开发框架是苹果公司为开发者提供的一套工具和API&#xff0c;旨在帮助开发者高效、安全地构建高质量的iOS、macOS、watchOS和tvOS应用程序。以下是对苹果APP开发框架的详细认识&#xff1a; 1. 框架的定义与作用 框架&#xff08;Framework&#xff09;是包含方法资源…...

SQL分组问题

下列为电商公司用户访问时间数据 统计某个用户连续的访问记录&#xff0c;如果时间间隔小于60s&#xff0c;就分为一组 id ts 1001 17523641234 1001 17523641256 1002 17523641278 1001 17523641334 1002 17523641434 1001 17523641534 1001 17523641544 1002 17523…...

笔记20250225

关于上拉电阻和下拉电阻的作用 原理 上拉电阻&#xff1a;在上拉电阻所连接的导线上&#xff0c;如果外部组件未启用&#xff0c;上拉电阻则“微弱地”将输入电压信号“拉高”。当外部组件未连接时&#xff0c;对输入端来说&#xff0c;外部“看上去”就是高阻抗的&#xff0c…...

千峰React:案例一

做这个案例捏 因为需要用到样式&#xff0c;所以创建一个样式文件&#xff1a; //29_实战.module.css .active{text-decoration:line-through } 然后创建jsx文件&#xff0c;修改main文件&#xff1a;导入Todos&#xff0c;写入Todos组件 import { StrictMode } from react …...

说说JVM的底层原理(JAVA是如何运行的)?

JVM 底层原理深度解析 Java 虚拟机&#xff08;JVM&#xff09;是 Java 程序运行的核心环境&#xff0c;其设计融合了内存管理、类加载、垃圾回收和高效执行等复杂机制。以下从底层视角详细解析其核心模块&#xff0c;并结合实际场景说明其工作原理。 一、类加载机制 1. 类加…...

IO 和 NIO 有什么区别?

文章目录 阻塞模式与非阻塞模式数据处理方式通信模型应用场景 阻塞模式与非阻塞模式 IO&#xff1a;是阻塞式的 IO 操作。在传统的 IO 中&#xff0c;当一个线程执行读操作或者写操作时&#xff0c;该线程会被阻塞&#xff0c;直到操作完成。例如&#xff0c;在从文件读取数据…...

JVM 面试

JVM 运行时内存区域划分是怎样的&#xff1f; 程序计数器&#xff1a;记录当前线程执行的字节码指令的地址&#xff0c;是线程私有的。 Java 虚拟机栈&#xff1a;每个方法在执行时都会创建一个栈帧&#xff0c;用于存储局部变量表、操作数栈、动态链接、方法出口等信息&#…...

七、Redis集群高可用

一、节点与插槽管理 添加主节点 准备节点 首先准备一个新的节点&#xff0c;添加配置文件。 vi /usr/local/redis/cluster/conf/redis-6377.conf # 放行访问IP限制 bind 0.0.0.0 # 端口 port 6377 # 后台启动 daemonize yes # 日志存储目录及日志文件名 logfile "/us…...

WPF12-MVVM

目录 1. 什么是MVVM2. 实现简单MVVM2.1. Part 12.2. Part 21. 什么是MVVM MVVM 是 Model-View-ViewModel 的缩写,是一种用于构建用户界面的设计模式,是一种简化用户界面的事件驱动编程方式。 MVVM 的目标是实现用户界面和业务逻辑之间的彻底分离,以便更好地管理和维护应用…...

多智能体博弈代码案例

多智能体博弈代码案例 直接可用,我不吝啬 from openai import OpenAI import random# 定义不同人物角色的提示 CHARACTER_PROMPTS = {"专家": "你是该领域的权威专家,知识渊博,回答严谨专业。"...

【AHK】资源管理器自动化办公实例/自动连点设置

此处为一个自动连续点击打开检查的自动化操作案例&#xff0c;没有quicker的鼠键录制&#xff0c;不常用了&#xff0c;做个备份 #MaxThreadsPerHotkey 2 ; 这个是核心&#xff01;&#xff01;&#xff01;&#xff01;确保可以同时运行多个热键或标签global isRunning : tru…...

Python安装环境变量

1、确保已经安装python到电脑上 2、到系统上环境变量位置 3、新建 系统变量&#xff0c;变量名为PYTHON_HOME&#xff0c;变量值为python安装目录 4、 点击系统变量的path&#xff0c;并新建环境变量 5、测试 &#xff0c;windowsR,并输入cmd&#xff0c;尝试命令python --ver…...

Flink同步数据mysql到doris问题合集

Flink同步数据mysql到doris 官方同步流程Doris安装下载地址导入镜像启动配置 Flink-cdc安装&#xff08;自制&#xff09;下载地址导入镜像启动命令 启动问题修复Flink报错Could not acquire the minimum required resources.作业报错 Mysql8.0 Public Key Retrieval is not al…...

Pytest测试用例执行跳过的3种方式

文章目录 1.前言2.使用 pytest.mark.skip 标记无条件跳过3.使用 pytest.mark.skipif 标记根据条件跳过4. 执行pytest.skip()方法跳过测试用例 1.前言 在实际场景中&#xff0c;我们可能某条测试用例没写完&#xff0c;代码执行时会报错&#xff0c;或者是在一些条件下不让某些…...

spring boot 连接FTP实现文件上传

spring boot 连接FTP实现文件上传 maven&#xff1a; <!--ftp--><dependency><groupId>commons-net</groupId><artifactId>commons-net</artifactId><version>3.8.0</version></dependency>接口示例&#xff1a; ApiO…...

深入解析/etc/hosts.allow与 /etc/hosts.deny:灵活控制 Linux 网络访问权限

文章目录 深入解析/etc/hosts.allow与 /etc/hosts.deny&#xff1a;灵活控制 Linux 网络访问权限引言什么是 TCP Wrappers&#xff1f;工作原理 什么是 /etc/hosts.allow 和 /etc/hosts.deny&#xff1f;匹配规则配置语法详解配置示例允许特定 IP 访问 SSH 服务拒绝整个子网访问…...

短跑怎么训练提高最快·棒球1号位

棒球运动员的短跑能力直接影响跑垒、防守和进攻效率&#xff0c;提升短跑速度需结合专项需求&#xff08;如爆发力、加速度、变向能力&#xff09;进行系统训练。以下为针对性训练方案&#xff1a; 一、专项爆发力训练&#xff08;提升起跑速度&#xff09; 抗阻冲刺 用弹力带…...

USRP7440-通用软件无线电平台

1、产品描述 USRP7440基于第三代XILINX Zynq UltraScale RFSoC架构&#xff0c;它将射频ADC、DAC、ARM、FPGA等集成一体&#xff0c;瞬时带宽可以达到2.5GHz&#xff0c;尤其适合于射频直采应用&#xff0c;比如通信与雷达。 第一代RFSOC高达4GHz • 8x 或 16x 6.554GSPS DAC…...

51c大模型~合集48

我自己的原文哦~ https://blog.51cto.com/whaosoft/11940475 #Mini-Omni 让大模型能听会说&#xff0c;国内机构开源全球首个端到端语音对话模型 本文出自启元世界多模态算法组&#xff0c;共同一作是来自清华大学的一年级硕士生谢之非与启元世界多模态负责人吴昌桥&…...

004-利用Docker安装Mysql

利用Docker安装Mysql 一、在镜像仓库找到 Mysql1.镜像仓库地址2.复制命令3.下载Mysql镜像4.查看镜像 二、创建实例并启动三、用本地工具连接数据库四、设置 Mysql 配置 一、在镜像仓库找到 Mysql 1.镜像仓库地址 https://hub.docker.com 2.复制命令 docker pull mysql:8.0…...

Web自动化之Selenium添加网站Cookies实现免登录

在使用Selenium进行Web自动化时&#xff0c;添加网站Cookies是实现免登录的一种高效方法。通过模拟浏览器行为&#xff0c;我们可以将已登录状态的Cookies存储起来&#xff0c;并在下次自动化测试或爬虫任务中直接加载这些Cookies&#xff0c;从而跳过登录步骤。 Cookies简介 …...

UEditor集成Markdown编辑功能方案

分步解决方案&#xff1a; 1. 推荐免费开源Markdown库 推荐使用 markdown-it&#xff08;MIT协议&#xff09; 官网&#xff1a;https://github.com/markdown-it/markdown-it 特点&#xff1a;轻量级&#xff08;15KB&#xff09;、扩展性强、支持CommonMark规范、中文文档丰…...

综合练习 —— 递归、搜索与回溯算法

目录 一、1863. 找出所有子集的异或总和再求和 - 力扣&#xff08;LeetCode&#xff09; 算法代码&#xff1a; 代码思路 问题分析 核心思想 实现细节 代码解析 初始化 DFS 函数 时间复杂度 空间复杂度 示例运行 输入 运行过程 总结 二、 47. 全排列 II - 力扣&a…...

Python之使用动态导包优化软件加载速度

在开发大型 Python 软件时,可能会遇到以下问题:由于静态导入了大量模块,导致软件启动时间过长,用户体验不佳。例如,一个复杂的桌面应用程序或 Web 服务可能依赖于多个大型库(如 numpy、pandas、torch 或 Yolo),这些库在启动时被静态导入,即使某些功能模块在启动时并不…...

第16天:C++多线程完全指南 - 从基础到现代并发编程

第16天&#xff1a;C多线程完全指南 - 从基础到现代并发编程 一、多线程基础概念 1. 线程创建与管理&#xff08;C11&#xff09; #include <iostream> #include <thread>void hello() {std::cout << "Hello from thread " << std::this_…...

建筑兔零基础人工智能自学记录33|基础知识1

插入学习一下一些基础概念&#xff1a; 1、基本概念 人工智能&#xff1a;让机器像人一样思考。机器学习ML&#xff1a;计算机获取知识的过程。深度学习&#xff1a;机器的一种思考方式&#xff08;借助神经网络&#xff09;。 三者关系 2、机器学习的方式 监督学习&#x…...

win11编译pytorchaudio cuda128版本流程

1. 前置条件 本篇续接自 win11编译pytorch cuda128版本流程&#xff0c;阅读前请先参考上一篇配置环境。 访问https://kkgithub.com/pytorch/audio/archive/refs/tags/v2.6.0.tar.gz下载源码&#xff0c;下载后解压&#xff1b; 2. 编译 在visual studio 2022安装目录下查找…...

Python—Excel全字段转json文件(极速版+GUI界面打包)

目录 专栏导读1、背景介绍2、库的安装3、核心代码4、完整代码(简易版)5、进阶版(GUI)总结专栏导读 🌸 欢迎来到Python办公自动化专栏—Python处理办公问题,解放您的双手 🏳️‍🌈 博客主页:请点击——> 一晌小贪欢的博客主页求关注 👍 该系列文章专栏:请点击——…...

NLP学习记录十一:位置编码

目录 一、位置编码的意义 二、位置编码方法 三、代码实现 一、位置编码的意义 在标准的注意力机制中&#xff0c;每个查询都会关注所有的键&#xff0d;值对并生成一个注意力输出&#xff0c;模型并没有考虑到输入序列每个token的顺序关系。 以["我&qu…...

算法之算法主题

程序员数学 《程序员数学 v2.0》 | 小傅哥 bugstack 虫洞栈 智力题 头脑风暴题目 | Java 全栈知识体系...