- 博客(30)
- 收藏
- 关注
原创 异常为什么要捕捉?------Java异常处理机制
本文探讨了Java异常处理机制,通过实例分析了未处理异常导致程序崩溃的问题。文章展示了try-catch结构如何捕获FileNotFoundException等特定异常,并详细解释了异常对象的使用方法。针对多种异常情况,提出了多catch块的处理方案,并介绍了try-catch-finally和throws声明两种异常处理方式。文中强调合理处理异常对保证程序完整执行的重要性,为开发者提供了实用的异常处理实践指导。
2025-12-20 21:07:22
158
原创 结构体有深拷贝么?什么时候需要深拷贝?
本文探讨了C++中深拷贝与浅拷贝的核心概念。当结构体/类只包含基本数据类型时,拷贝操作是安全的成员拷贝(值拷贝)。但当包含原始指针管理动态内存时,浅拷贝会导致多个对象共享同一内存,引发双重释放等问题。深拷贝通过复制指针及其指向的数据来解决这一问题。文章通过Student结构体的演变,展示了如何实现深拷贝构造函数和赋值运算符,并解释了编译器自动生成函数的规则。最后指出三五法则的重要性:管理资源的类需要完整实现五个特殊成员函数。结构体和类在拷贝行为上没有本质区别,只是教学惯例多用class演示这些概念。
2025-12-18 12:33:55
687
原创 关于方法重载的细节--Java静态绑定和歧义调用
本文分析了Java方法重载的编译机制。示例代码包含两个重载的product方法(参数类型分别为int,double和double,int),当main方法中调用product(aa,aa)时会产生歧义调用错误,因为两个int参数均可通过自动类型转换匹配两个方法,导致编译错误。而仅保留方法定义时能正常编译,因为编译器分阶段处理:先检查方法声明(允许合法重载),再检查方法调用(使用时才验证匹配性)。
2025-12-05 20:07:39
514
原创 算符重载 operator < 的返回值如何被使用
本文探讨C++运算符重载在自定义类型比较中的应用。通过定义apple结构体的operator<,使程序能比较其成员变量a的大小。std::sort默认使用operator<进行升序排列,当A.a<B.a为true时,A排在B前(不交换)。这与直觉可能相反,但符合STL约定:返回true表示元素顺序正确。
2025-11-25 11:37:05
827
原创 既然都include了,为什么还要namespace
C++命名空间(namespace)是解决大型项目中名称冲突的重要机制。本文通过引入include 概念,进行了对比,强调了命名空间概念存在的必要性。它通过创建不同的声明区域,允许相同名称在不同命名空间中独立存在。命名空间的价值体现在:避免命名污染,实现库版本管理,以及支持多库共存(如Boost与标准库)。常见用法包括:按模块划分命名空间(如StringUtils、MathUtils)、嵌套命名空间(Company::Project::Module),以及企业项目中严格划分的模块化设计。
2025-11-19 10:38:20
632
原创 先编译后运行,那编译之前呢?
这篇文章详细讲解了C/C++程序的完整编译过程,分为预编译、编译、汇编和链接四个阶段。首先通过预处理展开头文件和宏定义,生成.i文件;然后编译器将预处理后的代码转换为汇编代码.s文件;接着汇编器生成二进制目标文件.o;最后链接器合并目标文件,解析外部引用,生成可执行文件。文章以简单的box/apple程序为例,展示了每个阶段的具体操作和转换结果,并解释了头文件(.h)与实现文件(.c)分离的必要性。整个过程揭示了从源代码到可执行程序的完整转换流程。
2025-11-16 13:39:11
633
原创 Mac 目录树结构与基础 Linux 指令指南
作为开发者,理解操作系统目录结构和掌握基础命令行操作是必备技能。本文将系统介绍 macOS 的目录树结构以及常用的 Linux 指令,建立系统性的知识框架。
2025-11-16 12:12:47
894
原创 C时代的缺陷--烦死人的类函数宏 #define SQUARE(X) X*X
本文探讨了C语言中#define预处理指令和宏定义的使用方法与常见问题。文中通过多个示例展示了明示常量和带参宏(类函数宏)的应用,特别指出了类函数宏存在的调试困难和未定义行为等严重缺陷。重点分析了宏展开导致的优先级陷阱、参数多次求值等问题。
2025-11-14 20:24:31
575
原创 字符串常量池String-Pool是干啥的?声明String到底new 不 new?
该Java程序演示了字符串在内存中的存储机制。主要介绍了内存堆中普通对象和字符串常量置放的空间机制。尤其讲解了在创建字符串时使用还是不使用new算符的区别。另外更加提及了在编译时刻,编译器会检查并处理全部程序里出现的字符串字面量,这一步骤常常被初级学习者所忽略。
2025-11-07 19:22:00
508
原创 Java数组存储机制与引用原理深度解析
Java数组在内存中作为对象存储在堆区,数组变量则作为引用存储在栈区。数组对象包含对象头、长度字段和连续存储的元素数据。访问元素时通过引用定位对象并计算偏移量,确保安全访问。Java引用是受限制的指针,提供类型安全但禁止指针运算,隐藏底层细节以提高安全性。与C/C++不同,Java不允许直接获取实际内存地址。这种设计简化了编程模型,避免了内存错误的风险。
2025-11-06 12:38:19
235
原创 为什么arr[i]被理解为:arr + (i * sizeof(int))
摘要:本文探讨C语言中指针与数组的关系。指针通过地址操作提高效率,且编译器自动处理数据类型大小偏移。数组访问arr[i]本质是*(arr+i)的语法糖,甚至可写作i[arr]。此外:数组名不是指针变量,理解这些特性对掌握C语言底层机制至关重要。
2025-11-05 14:20:12
1034
原创 到底什么是:对称加密/非对称加密--公钥和密钥(下)
本文通过具体案例探讨非对称加密中公钥和私钥的设计原理。以密码118为例,当公钥a=27、私钥b=2963时,其乘积80001(即80000+1)能确保118×a×b的结果末三位仍为原密码。研究表明,只要a×b满足(x×10^y+1)的形式(如80001、1001等),就能保护y位密码不被泄露。前提是通信双方需约定y的取值范围。此外,验证发现当a×b末三位非001时,该方法可能失效,如009时就无法准确还原密码。这揭示了密钥设计中数学关系的重要性。
2025-11-01 19:20:00
391
原创 ++a+a++到底得什么?
本文通过++a+a++; 的一句表达式,来分析,C++/Java 语义规则。其重点探讨,未定义行为:程序行为不确定,可能产生任何结果。和另一个重要概念序列点:程序执行中的一些点,用于确保副作用的完成顺序,从而避免未定义行为。在C++中,如果一个表达式多次修改同一个变量且没有序列点分隔这些修改,或者在一个表达式中修改一个变量并使用它的值(且没有序列点分隔),那么就会导致未定义行为。
2025-10-28 13:13:37
940
原创 到底什么是:对称加密/非对称加密--公钥和密钥(上)
本文比较了密钥(key)和密码(password)的区别,介绍了密钥和密码使用的场景。文章还介绍了对称加密(相同密钥)和非对称加密(公钥/私钥对)的原理,通过快递情书等生活化例子说明其应用场景和优缺点。最后提出公钥/私钥设计的巧妙算法问题,为下篇博客埋下伏笔。
2025-10-24 20:35:12
868
原创 学习使用Clion--Clion指南(一)-入门导览/认识基本界面
本文介绍了Clion集成开发环境的基本使用方法。主要内容包括:1)如何运行程序,包括工具栏运行按钮和运行配置设置;2)项目视图和文件管理功能;3)程序构建和工具链配置;4)界面外观设置;5)调试工具的使用方法。文章旨在帮助初学者快速掌握Clion的基本操作,包括项目打开、代码编辑、程序运行和调试等核心功能,为后续更复杂的开发工作打下基础。
2025-10-20 22:14:05
216
原创 Java类与对象——对象的地址
本文阐述了Java中对象引用的概念。通过Student类示例说明,使用new创建对象时,系统会分配内存地址存储对象数据,而变量存储的是该地址引用而非对象本身。原始类型直接存储值,对象类型则存储实例地址。new操作符返回对象实例地址,引用变量指向该地址而非包含对象数据。
2025-10-20 22:11:04
224
原创 C/C++多文件组织结构详解(下)--从编译到构建的完整指南
本文介绍了C++多文件项目的构建方法,从手动编译、CLion集成环境到Makefile自动化构建。首先展示如何通过g++命令手动编译和链接多个源文件,说明其繁琐性;然后介绍CLion中基于CMake的一键构建方式,解释CMakeLists.txt的作用;最后详细讲解Makefile的编写和使用,重点说明其依赖检测和增量构建的优势。文章还对比了不同开发场景下的工作流程,并解析了编译、链接和构建的核心概念。通过这三种方法,读者可以全面理解多文件项目的构建原理,掌握现代化开发工具的高效使用方法。
2025-10-20 15:00:02
927
原创 如何理解main()的参数-argv/argc
解释main函数的参数,进而理解交互模式和批处理模式下,main函数参数对程序的运行的影响,本文从终端和环境2种模式下分别讲解了运行程序时,main 函数的参数设计。
2025-10-18 13:15:27
510
原创 来说说Java的类和对象:Class Vs. Object
本文主要讲解了java类和对象概念的区别以及java引用类型和内置类型的区别。重点讲解了引用类型在内存空间的存储形式,以及在声明引用类型的对象时,具体的步骤(涉及到构造函数)。
2025-09-28 20:40:11
638
原创 Clion无法在Microsoft Surface pro X -ARM64架构下完成debug工具链的设置
工具链 (Toolchain): LLVM-MinGW (下载于 GitHub releases, 文件 `llvm-mingw-20231122-ucrt-aarch64.zip`), 解压至 `C:\llvm-mingw-ucrt-aarch64\`.已确认这是一个架构匹配问题:目前使用的是 ARM64 的 CLion、ARM64 的 LLVM-MinGW 工具链(包含 `clang++.exe` 和 `lldb.exe`)。:CLion 对其自带工具(包括捆绑的 GDB)有特定的集成和优化。
2025-09-22 22:02:25
999
原创 App设计入门——如何使用设计模式
这篇文章介绍了在AppLab中使用DesignToolbox制作页面的基本方法。主要内容包括:1)通过拖拽添加和修改页面元素(图片、按钮、文本框等);2)使用预设主题快速调整整体风格;3)自定义颜色和字体;4)插入本地图片或网络图片;5)添加图标元素;6)合理命名元素(使用驼峰命名法)以提高可读性。文章强调了一些不可更改的约束条件,如元素基础类型和画布限制。这些功能可以帮助用户快速创建个性化的应用界面。
2025-09-15 20:39:07
245
原创 CPU和内存到底管啥的?
程序执行时,数据在“仓库”(内存)和“工作台”(寄存器)之间通过“高速公路”(总线)频繁流动,而真正的“加工”动作,永远发生在最快的工作台上。因此,汇编语言的学习很大程度上就是学习如何。
2025-09-13 18:21:31
941
原创 在CPU眼里——程序是如何运行的
(3)“堆”和“堆栈”之间有着巨大的内存空白,这让“堆”和“堆栈”有了充分的生长空间,虽然看上去非常浪费(如图8所示),但那仅仅是虚拟内存视角上的空白,只有在真正读写这段内存时,操作系统才会为其映射真正的物理内存,而且是用多少,映射多少。不过,由于程序还没有运行起来,变量b和c的值,还没有被main函数赋值,因此,它们现在的值可能是随机的。同时,也会分配“堆”和“堆栈”的内存区域,但在程序运行之前,“堆”和“堆栈”里面的内容是不确定的。A1:是的,可执行程序.exe在运行的时候,内存确实有不断增大的风险。
2025-08-27 17:51:45
637
原创 Java内存空间管理(对比 C++)
Java与C++内存管理对比:Java采用自动垃圾回收机制,对象统一分配在堆内存中。通过示例代码分析,Java的成员变量(如aa、x、ss)存储在堆中的对象内部,而局部变量(如y、bb)存储在方法栈帧中。与C++相比,Java无需手动释放内存,但GC可能带来性能开销。C++允许更灵活的内存控制(堆/栈分配),适合高性能场景;Java则更侧重开发效率和安全性。关键差异在于Java中所有对象都在堆中,而C++可以栈分配对象。
2025-08-15 19:42:05
987
原创 变量存储空间分析(全局数据区、Stack、Heap)
本文通过代码示例分析了变量在内存中的存储位置,主要分为三类:1)全局数据区存储全局变量和静态变量,生命周期与程序一致;2)栈空间存储局部变量,函数结束时自动释放;3)堆空间通过new动态分配,需手动释放。文章详细说明了各类变量的存储特点、管理方式及内存布局,并重点强调了堆内存泄漏风险,建议使用delete释放动态内存。最后通过内存布局示意图展示了代码区、静态数据区、堆和栈的空间分布关系。
2025-08-15 18:44:17
551
原创 Java-File类 Scanner类常用方法
本文介绍了Java中File类和Scanner类的使用方法。File类用于文件和目录操作,包括创建文件(exists()、createNewFile())、读取文件内容(结合Scanner)以及异常处理(IOException)。Scanner类提供nextLine()(读取整行)、next()(读取单词)和hasNext()(检查输入)等方法,适用于不同输入场景。文章通过完整代码示例演示了文件创建、读取及异常处理流程,并强调了注意事项,如文件存在性检查、方法混用风险及资源释放等。这些基础操作是Java文件
2025-08-12 16:11:53
536
原创 Java用循环判定 某数为斐波那契数列的第几项
于1202年提出的,其定义为:F(n)=F(n−1)+F(n−2),初始条件为F(0)=0,F(1)=1。这个数列最初用于描述兔子繁殖问题,因此也被称为“兔子数列”。判断n是否为斐波那契数,不是返回-1。若“是”则输出n(int n>1)的位置,我们可以用循环来生成斐波那契数列, 直到生成的某个数等于n,并返回当前的位置。(因为我还没学完array 这里用while循环而非递归写)小四号字都能占满109页pdf的“超级数字”【金山文档 | WPS云文档】 week3。
2025-03-30 17:24:43
460
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅