- 博客(35)
- 收藏
- 关注
原创 C++ : list
文章聚焦C++标准库双向链表容器std::list,剖析其核心特性与使用要点。阐述其作为双向链表的特性,如O(1)时间复杂度的任意位置插入/删除、不支持随机访问等;详解构造方法、迭代器操作等常用接口,强调insert/erase用法及迭代器失效问题;展示反向迭代器、链表节点等模拟实现细节;并与vector从底层结构、性能、空间利用等方面展开全面对比。
2025-05-26 08:00:00
729
原创 vector
本文介绍 C++ 中 vector 容器,内容涵盖:基本定义、存储特性、扩容机制及与其他容器对比;构造函数、迭代器操作、容量操作(size/reserve/resize)、修改操作(push_back/pop_back/insert/erase),并解析迭代器失效及解决方案;通过去重、生成杨辉三角等实例展示应用;深入底层实现,包括数据结构、空间管理及拷贝机制模拟等。
2025-05-22 21:50:31
569
原创 string 类
本文聚焦C++中string类,先对比C语言字符串在面向对象编程及内存管理上的局限,指出其风险。继而阐述string类动态扩容、边界检查等优势。接着详解其常用接口(构造函数、容量/访问/修改操作等)。还辅以力扣、牛客题目示例助理解。最后探讨string类模拟实现,对比传统与现代深拷贝写法。
2025-05-16 08:00:00
750
原创 C++ 的 IO 流
本文围绕C/C++输入输出体系展开,先介绍C语言scanf/printf及缓冲区作用;再阐释C++流的概念、标准IO流对象(cin/cout等)及文件流(ifstream/ofstream/fstream)操作;最后说明stringstream在类型转换、字符串拼接和数据序列化中的应用与优势。
2025-04-22 18:31:10
847
原创 C++ 多态与虚函数
本文系统解析 C++ 多态,涵盖概念(不同对象调同函数现异态)、构成条件(基类指针 / 引用调虚函数且派生类重写)。阐述虚函数重写及例外(协变、析构函数重写),C++11 的 override 和 final。介绍抽象类特性,多态原理(虚函数表、动态绑定等)。通过示例展示多继承虚函数表特性,如各基类独立表、合并表及未重写函数留原表等,助于深入理解多态机制。
2025-04-18 08:00:00
882
原创 C++ 异常
文章主要介绍了 C 语言和 C++ 的错误处理机制:C 语言常用返回错误码,严重时终止程序。C++ 异常通过 throw、try、catch 实现,有特定抛出、捕获规则,可重新抛出,使用时要注意安全和规范。C++ 标准库异常以父子类层次组织。实际开发可选用标准库或自定义异常体系。异常利大于弊,工程中鼓励使用。
2025-04-17 08:00:00
1890
原创 C++ 模板进阶
本文介绍C++模板相关知识。模板参数分类型和非类型形参,给出函数、类模板中其定义、调用格式与示例。阐述模板特化,函数模板特化有特定步骤,复杂参数建议用普通函数;类模板特化分全特化和偏特化,各有步骤与示例。还提及模板分离编译易出问题,建议声明与定义放同一文件,或显式实例化。最后总结模板优点为复用代码、提升灵活性,缺点是代码膨胀、编译耗时且错误难定位。
2025-04-14 10:48:18
615
原创 C/C++内存管理
本文系统介绍C/C++内存管理知识。先讲内存区域划分,包括栈、堆等。接着阐述C++动态内存管理,new/delete操作符分单个和连续空间操作,对比malloc/free,前者可初始化、处理自定义类型。还介绍operator new与delete函数及new/delete实现原理。提及定位new表达式,最后讲常见面试题,如malloc/free与new/delete区别、内存泄漏相关内容。
2025-04-10 22:41:25
1071
原创 C++进阶:继承与派生
💬 :如果你在阅读过程中有任何疑问或想要进一步探讨的内容,欢迎在评论区畅所欲言!我们一起学习、共同成长~!1.1.1 继承的概念在面向对象程序设计中,继承是实现代码复用的核心方式。程序员可保留原有类特性,为其扩展新功能,由此创建的新类即派生类。继承构建起面向对象程序设计的层次结构,契合人类从简单到复杂的认知规律与思维模式。它和常见的函数复用不同,函数复用针对单个或多个函数,继承则从类的整体架构出发,复用原有类属性和方法并加以拓展创新,实现更高级别的代码复用。1.2 继承的定义。
2025-04-08 11:43:22
720
原创 类与对象(三)
学习类和对象时,要明白类是对一类实体(对象)的抽象描述,定义属性和方法后形成新的自定义类型,利用该类型可实例化出具体对象,为计算机模拟现实提供工具。为友元函数,可使全局函数访问私有成员,从而在符合使用习惯的同时,实现输入输出流运算符的重载。友元类的所有成员函数都能够成为另一个类的友元函数,从而可以访问该非友元类中的非公有成员。当一个类的定义嵌套于另一个类的内部时,处于内部的这个类被称作内部类。但全局函数在类外,无法直接访问类的私有成员,而实现。修饰的成员函数是静态成员函数。的类成员被称作类的静态成员。
2025-03-25 17:03:41
610
原创 类与对象(二)——类的 6 个默认成员函数
如果一个类中什么成员都不写,编译器会自动生成 6 个默认成员函数。(1)使用已存在对象创建新对象时(2)函数的形参和实参类型都为类类型对象时(3)函数返回值类型为类类型对象时示例:2.3 默认构造函数2.3.1 默认构造函数分类C++ 里,默认构造函数可分为两类:(1)编译器自动生成的默认构造函数(2)用户显式定义的默认构造函数:无参构造函数;全缺省构造函数示例:2.3.3 默认构造函数与成员变量初始化在 C++11 标准之前,编译器生成的默认构造函数,在 类中未显式定义
2025-03-21 00:14:27
334
1
原创 类与对象(一)
如果嵌套了结构体,嵌套的结构体要对齐到自己的最大对齐数的整数倍处,结构体的整体大小是所有最大对齐数(包含嵌套结构体的对齐数)的整数倍。成员函数不属于某个具体的对象,而存放在公共的代码段,所有该类的对象共享同一份成员函数代码。:访问限定符主要是在编译阶段发挥作用,用于保证代码的安全性和规范性,而在内存中,对象的成员变量并没有访问限定符的区分。类定义了新的作用域,类的所有成员都在类的作用域中。但是类的成员函数是所有对象共享的。空类:没有任何成员变量和成员函数的类,或者只有成员函数而没有成员变量的类。
2025-03-12 22:45:31
994
原创 C++ 入门
引用本质上是对象的别名,若对象已被销毁,引用就会指向一个无效的内存地址,从而导致未定义行为,则必须使用传值返回。:在函数声明中,若多个参数带有默认值,这些参数必须从最右边的参数开始依次向左设置默认值,不能出现中间参数有默认值而右边参数无默认值的情况。但实际中,确定表达式的类型并非易事。值作为参数时函数传递实参,值作为返回值时函数返回变量的临时拷贝,效率较低,尤其是参数或返回值类型较大时。关键字定义,它可以将标识符的名称进行本地化,即将标识符限制在特定的作用域内,从而有效避免命名冲突。
2025-03-11 22:21:23
1568
1
原创 C 语言数据结构(三):栈和队列
好比排队收银,排在队伍前面的顾客先结账离开队伍,而后到的顾客要在后面依次等待。就像往一个桶里放东西,最后放进去的东西会在最上面,取的时候最先被取出。在数据结构中,一个节点通常由多个部分组成,其中用于存储实际数据的部分称为。栈是一种特殊的线性表,它只允许在固定的一端进行插入和删除元素操作。队列是只允许在一端插入数据,在另一端删除数据的特殊线性表。
2025-03-08 12:45:10
680
原创 C 语言数据结构(二):顺序表和链表
线性表(linear list)是 n 个具有相同特性的数据元素的有限序列。它是一种在实际中广泛使用的数据结构。常见的线性表包括:顺序表、链表、栈、队列、字符串等。线性表在逻辑上是线性结构,即一条连续的直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。2. 顺序表2.1 概念及结构顺序表是用一段。
2025-03-07 21:24:08
928
原创 C 语言数据结构(一):时/空间复制度
一、前言一、前言1. 什么是数据结构数据结构(Data Structure)是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合。2. 什么是算法算法(Algorithm)是明确的计算流程,它接收一个或一组输入值,经过一系列计算步骤后,输出一个或一组结果,其作用就是把输入数据转变为输出结果。二、时 / 空间复杂度1. 算法效率算法在编写成可执行程序后,运行时需要耗费时间资源和空间(内存)资源。因此,即时间复杂度和空间复杂度。
2025-03-05 00:37:15
992
原创 预处理详解
运算符在 C 语言预处理阶段发挥作用,它能将位于其两边的符号合并成一个新的符号,常用于从分离的文本片段创建合法的标识符,这种操作也被称为记号粘合。许多 C 编译器允许在命令行中定义符号(变量),这些符号在编译过程中可控制程序行为,从而可根据同一源文件编译出不同版本的程序。当宏参数在宏的定义中出现超过一次,且参数带有副作用时,使用宏可能导致不可预测的后果。如果某个表达式的值为真,则编译其对应的代码块,并跳过后续的。连接产生的结果必须是一个合法的标识符,否则其结果是未定义的。是否定义,若定义则调用相应函数;
2025-02-28 01:35:14
798
原创 C 语言文件操作详解
每个使用中的文件会在内存开辟文件信息区,存放文件名字、状态、当前位置等信息,这些信息存于系统声明的 FILE 结构体变量。函数根据文件指针的当前位置和指定的偏移量,重新定位文件指针的位置,就好像在文本编辑器中移动光标到指定的位置一样。因为有缓冲区的存在,C 语言在操作文件时,需要刷新缓冲区或者在文件操作结束时关闭文件,否则可能导致读写文件的问题。在程序设计中,一般谈及的文件有两种,即从文件功能角度分类的程序文件和数据文件。类型的指针变量,该变量指向该文件,相当于建立了指针和文件的关系。
2025-02-27 11:14:44
693
原创 动态内存管理
然而,在某些情况下,我们需要的空间大小只有在程序运行时才能确定,这时数组编译时开辟空间的方式就无法满足需求。执行函数时,函数内局部变量的存储单元在栈上创建,函数执行结束时这些存储单元自动被释放。这意味着这块内存虽然不再被程序使用,但仍然被标记为已分配状态,无法被其他程序或当前程序的其他部分再次使用,从而造成了内存泄漏。函数内的局部数组,函数结束后,其内存已被释放,返回的指针指向已释放的内存,属于悬空指针,使用该指针会导致未定义行为。该函数在调整原内存空间大小的基础上,还会将原来内存中的数据移动到新的空间。
2025-02-26 00:20:38
825
原创 自定义类型
早期 C 标准规定,位段的成员必须是 int、unsigned int 或 signed int。后来 C99 标准中,位段成员的类型也可以选择其他类型,如 char、short、_Bool类型等。位段的成员名后边有一个冒号和一个数字。(冒号后面的数字表示该位段成员在内存中所占用的二进制位数)// A 是一个位段类型struct Aint _a:2;int _b:5;int _c:10;int _d:30;
2025-02-24 22:45:48
949
原创 数据在内存中的存储
大端字节序存储模式:数据的低位字节内容保存在内存的高地址处,而数据的高位字节内容,保存在内存的低地址处(可以简单理解为 “高位在前,低位在后”,就像我们书写数字从高位开始写起一样)。小端字节序存储模式:数据的低位字节内容保存在内存的低地址处,而数据的高位字节内容,保存在内存的高地址处( “低位在前,高位在后”)。从数值表示角度,左边的字节权重更高,称为高字节;右边的字节权重更低,称为低字节。例如一个 32 位的 int 型整数 ,其十六进制为 0x5678ABCD ,
2025-02-23 15:21:24
1022
原创 C语言内存函数
memset 函数用于将指定内存区域的前若干个字节设置为指定的值,常用于初始化内存或清空内存。当源内存区域和目标内存区域有重叠时,建议使用 memmove 函数。
2025-02-22 14:26:59
481
原创 字符函数和字符串函数
当使用标准库函数发生了某种错误时,就会将对应错误码存放在errno中,而错误码的数字难以理解,所以每一个错误码都有对应的错误信息。C语言程序启动时使用一个全局变量errno记录程序的当前错误码,但程序启动时errno是0,表示无错。不同的系统和C语言标准库的实现中都规定了一些错误码,一般放在 errno.h 头文件中说明。strerror 函数可以返回参数部分错误码对应的错误信息的字符串地址。
2025-02-20 23:54:37
1018
原创 指针(3)
qsort 是 C 标准库中的一个通用的排序函数,它可以对任何类型的数组进行排序。qsort 排序结果默认为升序。(1)arr :要排序的数组的首元素地址(2)n :数组元素的数量(3)size :单个元素的大小(单位为字节)(4)compar :一个指向比较函数的指针,该比较函数决定元素的排序。
2025-02-20 00:00:51
371
原创 指针(2)
分别比较arr[0] 和 arr[1] 、arr[1] 和 arr[2] 、arr[2] 和 arr[3] 、arr[3] 和 arr[4] 、arr[4] 和 arr[5] 、arr[5] 和 arr[6] 、arr[6] 和 arr[7] 、arr[7] 和 arr[8] 、arr[8] 和 arr[9];typedef 是C语言中的一个关键字,用于为现有的类型定义一个新的名字,这使得代码更加简洁和易于理解。函数指针数组的每个元素都是 指向函数的指针 ,这些指针必须指向相同返回类型和参数类型的函数。
2024-12-26 14:13:04
747
2
原创 指针(1)
类型名* 指针变量名类型名表明 被指向变量 的类型。若无返回类型或不确定返回类型,可写void。* 为指针运算符 / 解引用操作符 / 间接访问操作符,用于访问指针所指向的内存位置的数据。若指针变量名为p,*p表示指针变量p指向的对象。*p=a ,p=&aint main()//把变量a的地址赋给指针变量*pointer_1return 0;
2024-12-21 13:53:03
876
1
原创 操 作 符
2进制的数字每一位都由0或1组成满2进1202^020212^121222^222先记住下表中加粗的操作符,其它操作符使用时再查看即可。优先级运算符描述结合性1++ , - -后缀自增、自减从左往右()函数调用(由于圆括号的优先级最⾼,可以用它改变其他运算符的优先级)[]数组下标直接访问结构体与联合体成员->通过指针间接访问结构体与联合体成员复合字面量(C99)2++ , - -前缀自增、自减从右往左+ , -单目运算符!, ~逻辑非,按位取反。
2024-12-19 19:38:55
908
1
原创 函数之递归
递归是一种通过函数在其定义中直接或间接调用自身来解决问题的方法,通过将大问题分解为规模更小的同类问题,直到问题规模缩小到可以直接解决(终止条件),再逐步返回结果,最终解决原始问题。特点:• 递归需要有一个终止条件,防止函数无限调用自己• 把一个大问题分解成相似但规模更小的问题前面举例中,如果为较大的 n 值,使用递归可能会导致栈溢出。因为每次递归调用都会将当前函数的信息压入栈中,如果 n 很大,可能会耗尽栈空间。在这种情况下,可以考虑使用迭代的方式来解决该问题,避免栈溢出。
2024-12-13 21:46:42
626
1
原创 函数的基本内容
自定义函数是程序员自行编写定义,按特定规则完成特定任务的函数。函数定义如下:函数返回类型 函数名(0~多个形式参数)函数体函数声明为“ 函数返回类型 函数名(0~多个形式参数);函数声明中形参只保留类型,省掉名字也可,如int Add(int,int)。函数要先声明后调用,而函数的定义是一种特殊的声明。在需要跨文件共享变量时,使用普通的全局变量,并使用 extern 进行适当声明;在需要限制变量仅在一个文件内使用时,使用 static 修饰全局变量。
2024-12-12 20:14:48
715
1
原创 分支和循环语句
if 语句的语法形式如下:if ( 表达式 )语句表达式成立(为真),则语句执行;表达式不成立(为假),则语句不执行。C语言中,0表示假,非0表示真。
2024-10-01 00:35:35
1439
1
原创 C语言数据类型和变量
解读用户输入时,会从上一次解读遗留的第一个字符开始,直到读完缓存,或遇到第一个不符合条件的字符为止。printf() 参数与占位符是一一对应关系,若有 n 个占位符, printf() 的参数就应有 n +1 个。printf() 不会在行尾自动添加换行符,运行结束后,光标就停留在输出结束的地方,不会自动换行。%c 不忽略空白字符,总返回当前第一个字符,无论该字符是否为空格。若要强制跳过字符前的空白字符,可写成 scanf(" %c", &ch) ,即 %c 前加上一个空格,表示跳过零个或多个空白字符。
2024-09-13 14:18:05
1206
1
原创 C语言常见概念
C语言是一门编译型计算机语言,C语言源代码是文本文件,文本文件本身无法执行,必须通过编译器翻译和链接器的链接,生成二进制的可执行文件,可执行文件才能执行。这个 \0 字符是字符串的结束标志,所以使用 printf() 打印字符串或strlen() 计算字符串长度时,遇到 \0 就自动停止了。控制语句用于控制程序的执行流程,以实现程序的各种结构方式(C语言支持三种结构:顺序结构、选择结构、循环结构),它们由特定的语句定义符组成。\0 是 \ddd 这类转义字符的一种,用作字符串的结束标志,其。
2024-08-22 22:02:46
705
8
原创 C语言——启程
临近大一开学时我偶然刷到了C语言,对C语言编程产生兴趣,且本人专业入学后将涉及编程语言的学习,于是我毅然决定踏上C语言学习之路。我印象中敲代码是件高难度的事,但是难不难的,先行动感知了再说。对于编程学习,我的目标是掌握C/C++方面技能,争取在大三拿到一份令人满意的offer。包括C语言,数据结构算法,C++语言,Linux,MySQL等。3.坚持写博客,对知识进行梳理总结,加深理解。最后,请相信自己潜力无限,一起加油吧!我是桂林电子科技大学的一名学生。2.勤动手,坚持每天敲代码,熟能生巧。
2024-08-22 00:00:59
280
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人