自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(28)
  • 收藏
  • 关注

原创 《C++模板栈实现详解》

避免浅拷贝问题(多对象共享内存导致重复释放)。避免内存分配失败时抛出异常。返回引用允许直接修改栈顶元素。容量,用户可自定义初始容量。栈满时触发扩容,失败返回。内存,重置指针和状态。指针(不删除数据)。(会产生临时对象)。

2025-03-02 11:51:17 243

原创 《C++深拷贝与浅拷贝:内存安全的拷贝构造函数实践》

若自定义拷贝构造函数、拷贝赋值运算符或析构函数中的一个,必须显式实现三者。避免手动管理内存,直接利用标准库的深拷贝能力。:析构时多个对象尝试释放同一内存,导致崩溃。:直接复制指针值,新旧对象共享同一块内存。:通过任意对象修改内容,影响所有共享对象。:一个对象释放内存后,其他对象指针失效。:每个对象持有独立内存块。:明确处理空指针输入场景。提升大内存块复制效率。检查防止未定义行为。

2025-03-02 11:17:16 320

原创 《C++运算符重载深度解析:从加法、流操作到仿函数与类型转换》

public:~Int()Int& operator=(const Int& it) //用const引用右值if (this == &it) //防止自己给自己赋值。

2025-03-02 11:10:51 781

原创 C/C++字符串格式化全解析:从printf到std::format的安全演进与实战指南

用。

2025-02-17 23:29:35 1341

原创 C++构造函数详解:从基础到类型转换机制

函数名必须与类名一致无返回类型声明(包括void)对象创建时自动调用且仅调用一次支持重载与类外定义默认构造函数规则:未声明时编译器自动生成声明任意构造函数后需手动定义无参构造参数带默认值的构造函数视为默认构造优先使用成员初始化列表关键构造函数声明为explicit注意多参数构造的隐式转换规则统一初始化语法{}更安全监控隐式转换的性能影响通过深入理解构造函数的双重角色(对象创建器+类型转换器),开发者可以写出更安全高效的C++代码,在灵活性和严谨性之间取得最佳平衡。

2025-02-17 00:24:58 978

原创 C++拷贝构造函数初级解析:设计要点、调用机制与性能优化实践

本文深入探讨C++拷贝构造函数的核心设计原理与调用机制。首先通过形参类型分析,指出必须使用const引用以避免无限递归和常对象兼容性问题。其次,结合代码示例解析拷贝构造函数在**函数传参(值传递)和返回值(生成将亡值)**场景下的调用次数,揭示其底层实现逻辑。最后,提出优化策略:形参采用引用传递减少拷贝开销,直接构造不具名对象利用返回值优化(RVO)消除冗余临时对象。文章通过理论分析与实践案例,为开发者提供高效管理对象拷贝的解决方案,助力提升C++程序性能。

2025-02-16 20:40:14 536

原创 深入解析C++静态关键字:生命周期、存储管理与C++11线程安全实现

本文系统解析C++中静态关键字(static)的核心机制与实际应用。从生命周期调整与存储位置入手,通过代码示例剖析静态局部变量的初始化特性(如仅构造一次、值持久化),揭示编译器通过数据区标记位实现单次初始化的底层逻辑。重点探讨C++11标准对静态局部变量线程安全性的增强:基于双重检查锁定(Double-Checked Locking)的初始化保护机制,并对比C++11前的潜在风险。文章进一步指出,线程安全仅覆盖初始化阶段,后续并发读写仍需同步,结合互斥锁与原子操作提出解决方案。最后总结静态关键字的最佳实践。

2025-02-16 02:28:27 1197

原创 函数调用过程的详细解析

按照调用约定(如cdecl),参数从右向左依次压入栈中,esp(栈顶指针)随之下移。call 指令执行时,将下一条指令的地址(返回地址)压入栈中,并将控制权交给被调函数(修改 eip 为函数入口地址)。进入被调函数后,先保存调用者的 ebp(基址指针):push ebp。随后将当前 esp 赋值给 ebp,建立新栈帧:mov ebp, esp。调整 esp 为局部变量预留空间(如 sub esp, 20),可能用特定值(如 0xCC)填充以辅助调试。

2025-02-15 21:00:59 1022

原创 #define宏与编译时定义的本质对决:从const常量到typedef的类型安全演进

本文深入探讨了C/C++中三种定义机制——#define宏、const常量和typedef类型别名的本质差异及其适用场景。首先,通过对比#define的预处理文本替换与const的编译时类型安全,揭示了宏定义在类型检查、作用域控制和调试信息方面的局限性,同时强调了const在代码健壮性上的优势。其次,分析了typedef与#define在类型别名定义中的差异,重点阐述了typedef的编译时类型检查、作用域规则以及对复杂类型(如函数指针和模板)的支持能力,同时指出了宏定义在类型安全和可维护性上的潜在风险。

2025-02-14 22:36:22 856

原创 C++ 完美转发:泛型编程中的参数无损传递

是 C++11 引入的特性,与完美转发(Perfect Forwarding)相关,用于在泛型编程中保留参数的原始类型(左值/右值、常量性等)。它的核心目标是避免不必要的拷贝或类型丢失,同时支持移动语义和泛型代码的高效性。,结合模板类型推导和引用折叠规则,可以将参数“原样”传递给其他函数。避免不必要的拷贝,同时正确处理左值/右值。:若直接传递参数,右值可能退化为左值,导致无法触发移动语义。:若参数是临时对象(右值),未正确传递会导致拷贝而非移动。的类型,将参数转换为原始的左值或右值引用。

2025-02-14 19:04:18 497

原创 C++ decltype 与 C 语言 typeof 的对比与应用:编译时类型推导的实践与思考

decltype在编译时推导类型,不会执行表达式。如果表达式是左值,decltype推导出引用类型。如果表达式是右值,decltype推导出值类型。这个特性使得decltype在模板编程和泛型编程中非常有用,尤其是在需要根据表达式类型推导出变量类型时。通过typeof_a > _b?_a : _b;})// 输出 10// 输出 3.14return 0;

2025-02-13 23:51:58 1033

原创 程序的内存管理与C/C++动态内存分配详解

在使用malloc进行内存申请时,不仅申请40个字节(用cd填充),并且在四十个字节头和尾部,有一片空间是为了防止内存越界(用fd填充),再往上有一片空间(头部信息),这片空间大约28个字节,存储申请空间地址的双链表,在这28字节下边存储着此次malloc所需要使用的字节数(40)。删除并不是删除变量本身,而是将变量指向的的空间还给堆区,从引用状态变为未引用,在删除后变量里存的还是这片空间的地址,此时的指针称为失效指针(失能指针),所以要在delete后将指针置为空。new申请空间失败:返回异常。

2024-11-04 22:21:24 942

原创 命名空间、域、同名隐藏

同名隐藏,在C++中,是指当一个类(或作用域)中存在与父类(或外部作用域)中同名的成员或变量时,内部的同名成员或变量会隐藏外部同名的成员或变量。如果存在两个或多个具有包含关系的作用域,外层作用域声明了一个标识符,而内层作用域也声明了同名标识符,那么外层作用域的标识符在内层作用域中将不可见,即被内层作用域的标识符所隐藏。如果派生类声明了一个和基类成员同名的新成员(无论是函数还是变量),那么基类中的同名成员在派生类的作用域内将被隐藏。这些标识符在函数内部是可见的,但在函数外部是不可见的。

2024-11-04 22:14:28 390

原创 c++ 函数模版

为了代码重用,代码就必须是通用的;通用的代码就必须不受数据类型的限制。那么我们可以把数据类型改为一个设计参数。这种类型的程序设计称为参数化程序设计。

2024-11-02 19:59:11 791

原创 C++ 函数重载:概念、规则、调用约定与名字修饰

在c语言中,实现int, double,char 类型的比较大小函数。a : b;a : b;a : b;这些函数都执行了相同的一般性动作;都返回两个形参中的最大值;从用户的角度来看, 只有一种操作 ,就是判断最大值, 至于怎样完成其细节,函数的用户一点也不关心。: 在同一个域中出现的名字必须指向一个唯实体(函数体)。这种复杂性给程序员带来了一个实际问题 ,他们必须记住或查找每一个函数名字。函数重载把程序员从这种词汇复杂性中解放出来。

2024-11-02 18:41:02 957

原创 内联函数与宏函数的对比及内联函数的使用

内联函数是C++中用于优化函数调用开销的一种机制。与宏函数相比,内联函数具有类型安全检查、可调试、易于编写和维护等优点。然而,内联函数的使用也需要注意一些问题,如函数体的大小、递归函数的处理以及声明和定义的放置等。正确使用内联函数可以提升程序的运行效率,但也需要根据具体情况进行权衡和优化。

2024-11-02 01:09:54 343

原创 C++中指针、引用与const的深入解析

然而,对于引用类型的数组,每个元素都需要一个已存在的对象来引用,这在数组声明时通常是不可能的,因为编译器不知道要引用哪些具体的对象。②定义s2是一个指向常量的指针的引用,仍然是p的别名,但是这个别名指向的位置是常性的,这意味着通过 s2,不能修改。①定义s1是p指针的引用,即s1是p的别名,如果修改s1自身,就会试图修改p的值,所以不能编译通过;④s4是一个常性的指向常量的指针的引用,既不能修改 s4 指向的地址,也不能修改 s4指向的值。//s是p的指针,保存p的地址。//通过解引用修改的是a的值。

2024-10-23 23:25:48 969

原创 C++中的值类别与引用

特别是当右值引用引用的是一个即将被销毁的对象时,通过右值引用进行修改可能会导致程序崩溃或其他不可预测的行为。表示的引用,从C++11开始引入,用于引用右值。但需要注意的是,右值引用的对象可能是即将被销毁的(特别是当右值是一个临时对象时),因此通过右值引用进行修改可能是未定义行为。需要注意的是,现代C++中“亡值”这个术语的使用已经不太常见,更多时候我们使用“右值”来指代这类值。需要注意的是,右值并不一定意味着“即将消亡的值”,但在早期C++中,这个术语经常与临时对象的生命周期联系在一起。

2024-10-23 23:16:56 262

原创 C++中引用的特性及其优势:以Swap函数为例

深入探讨C++中引用的特性及其在实际编程中的优势。通过详细分析引用的定义、特点以及与指针的区别,本文将进一步阐述引用在提升代码安全性、简洁性和可读性方面的作用。此外,文章还将以Swap函数为例,展示引用在函数参数传递中的具体应用和效果。

2024-10-10 23:26:39 219

原创 指针和const之间的关系

代码分析:在此代码中,a为常性,即a自身的值不能被改变,p1保存a的地址,因为a是常性,所以在定义指针时,应该不能通过指针修改a的值,所以应该在*的左边加上const,表示该指针不能修改指向,因此上述代码只有p2和p4能够编译通过。代码分析:在此代码中,p的指向被修饰为常性,意味着不能通过指针修改a的值,因此,如果再定义一个指针保存p的地址时,新指针不能通过解引用进行修改,即在传递的过程中不允许能力扩张,上述代码中s2和s4可以被编译通过。//error,const修饰了指针的指向,不能通过指针修改。

2024-10-10 22:50:40 815

原创 对常变量来说c和c++的编译政策不一样

在我们整个程序运行阶段,要经过预编译、编译、汇编、链接这几个过程,实际上c++编译器在预编译过程中,将所有的常变量已经替换成常量表示,在这个程序中就是把a用10代替,这就是为什么会有上边的运行结果,同时也是为什么用常变量做数组后缀可以通过的原因。在代码中,我们用了耍流氓的方式将a这个常变量的值改为了100,之后将a的值赋给b,按正常情况来说,a和b的值打印出来应该是100,那为什么只有*ip的值是100呢?当我们的程序用c编译器编译时下面的代码是不能通过的,即在c语言中学习的变量名不能在数组后缀中使用。

2024-10-10 21:19:20 506

原创 #if #ifdef #else #endif用法解释

例如,我们有一个数据类型,在Windows平台中,应该使用long类型表示,而在其他平台应该使用float表示,这样往往需要对源程序作必要的修改,这就降低了程序的通用性。它的作用是:当标识符已经被定义过(一般是用**#define**命令定义),则对程序段1进行编译,否则编译程序段2。如果一个C源程序在不同计算机系统上运行,而不同的计算机又有一定的差异。如果在Windows上编译程序,则可以在程序的开始加上。这种条件编译可以提高C源程序的通用性。#ifdef 标识符。#ifdef 标识符。

2024-10-09 23:39:40 289

原创 如何判断一段程序是由 C 编译程序还是由 cpp 编译程序编译的?

2、有时候我们可能需要在程序运行时(而非编译时)判断当前代码是由C编译器还是C++编译器编译的。编译器在编译过程中会定义一些特殊的宏,这些宏可以在源代码中被用来进行条件编译或运行时检查。而C++则使用C++编译器,该编译器不仅支持C语言的全部功能,还扩展了诸如类、继承、多态、模板等面向对象编程的特性。编译器在编译过程中,会根据源文件的扩展名来智能地选择使用哪种编译器进行编译。在编译时,C和C++的编译器存在显著差异,这是因为它们遵循不同的语言标准和规范。#else // 这段代码是在C编译器下编译的。

2024-10-09 23:32:45 669

原创 C++ 字符串与字符数组

字符数组必须以空字符('\0')终止,否则可能会导致未定义行为。在C++中,当字符数组的初始化列表中的字符数量少于数组大小时,剩余的位置会被自动填充为空字符。cout和printf在打印字符串时,会在遇到'\0'时停止。函数可以用于从标准输入读取一行字符串,直到达到指定的长度或者遇到指定的结束符。

2024-10-08 20:59:38 433

原创 c和c++不同的输入输出方式

/endl相当于\n,有缓冲区,当碰到endl时就把缓冲区的东西打到屏幕上。//没有缓冲区,直接打到屏幕上。stderr 不能将输出重定向,只能输出到控制台中。}//用Linux ./main > 1.txt。stdout 可以将输出重定向到某个文件上;{ //数据类型的变化不会改变代码语句。

2024-10-08 20:59:04 214

原创 ()初始化与{}初始化方式的不同

C++11引入了统一的初始化方案,使用花括号进行初始化,适用于各种类型的变量。//不会进行类型转化,要求严格。int sum();//可能是一个函数的声明。int num{};//用0对变量做初始化。

2024-10-08 20:35:31 342

原创 关于结构体大小的计算问题(c语言)

在计算机中,我们所有创建的数据存储在内存中。当我们开始定义一个结构体,它会占用一段内存空间。理论我们应该按照各自的数据类型所占用的字节任意的存储,我们也可以从任意起始地址访问任意变量,但在实际内存读取中,访问数据变量时一般是从特定的内存起始地址进行访问, 因为cpu读取并非是逐字节读取的,而是按照2,4,8这样的倍数读取,一般是从偶数地址开始,在不同的平台上对齐方式也是不一样的。32位系统中,CPU一次可以存取4字节的数据;64位系统中,CPU一次可以存取8字节的数据。

2024-03-27 23:45:55 1250

原创 c语言学习笔记整理(输入函数)

关于c语言输入部分的问题整理

2024-03-01 18:04:52 976 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除