自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 大话C++:第32篇 关联容器

set是一种关联容器,它存储了一组唯一的元素,并保证这些元素是按某种顺序排序的。set通常是基于平衡二叉搜索树(如红黑树)实现的,这使得它在添加、删除和查找元素时都能提供对数时间复杂度的性能。set容器主要特点:存储不重复的元素:这是set最基本的特点,它不允许存储重复的元素,所有元素都是唯一的。set中的元素会自动按照一定的顺序进行排序。默认情况下,元素是按照从小到大的顺序排序的,但也可以自定义排序规则。set。

2025-01-04 13:41:40 860

原创 大话C++:第31篇 顺序容器

C++标准模板库(STL)中的容器是用于存储集合数据结构的模板类。容器可以分为几个不同的类别,每种类别都有其特定的用途和特性。顺序容器:存储一序列的元素,可以进行随机访问。vector:可变大小数组,支持快速随机访问。deque(双端队列):双端队列,支持快速的前端和后端插入和删除操作。list:双向链表,支持高效的元素插入和删除操作。关联容器:用于存储键值对,可以快速进行查找、添加和删除操作。set:唯一值的集合,自动排序。map:键值对的集合,键是唯一的,自动排序。multiset:允许有重复值的集合。

2025-01-04 12:03:46 832

原创 大话C++:第30篇 破解shared_ptr引发的循环引用问题

正式介绍循环引用问题之前,我们必须先要掌握weak_ptr。

2024-11-30 10:32:30 579

原创 大话C++:第29篇 详解共享智能指针

是C++11引入的一种智能指针,它实现了共享所有权的方式来管理资源对象。也就是说,没有特定的shared_ptr拥有资源对象,相反,这些指向同一个资源对象的shared_ptr相互协作来确保该资源对象在不需要的时候被析构。

2024-11-16 10:13:23 920

原创 大话C++:第28篇 详解独占智能指针

C++中的智能指针是一种用于管理原生指针(raw pointer)生命周期的对象。智能指针的引入主要是为了帮助开发者避免原生指针在使用过程中可能产生的一些问题,如内存泄漏、野指针(dangling pointer)等。:这是一种独占所有权的智能指针,它负责对象的生命周期。当被销毁时,它所指向的对象也会被自动销毁。这种智能指针保证同一时间只能有一个指向同一个对象。它不能被复制到其他,但可以通过std::move来转移所有权。:这是一种共享所有权的智能指针。多个。

2024-11-16 09:53:02 435

原创 大话C++:第27篇 Lambda表达式

在C++中,lambda表达式(也称为闭包)是一种可以定义匿名函数对象的便捷方式。它们能够捕获所在作用域中的局部变量,并且可以在需要函数对象的地方使用。Lambda表达式为C++提供了更简洁、更灵活的函数式编程方式。其中,capture:捕获子句,用于指定lambda可以访问的外部变量的列表。捕获可以是按值()或按引用(),或者显式列出要捕获的变量。parameters:lambda函数的参数列表,与普通函数的参数列表类似。mutable可选的。如果指定了mutable。

2024-11-05 13:57:01 1047

原创 大话C++:第26篇 类模板

类模板是一个参数化类型,它使用一个或者多个参数来创建一系列类。类模板可以定义数据成员和函数成员,也可以使用访问标号控制对成员的访问,还可以定义构造函数和析构函数等。在类和类成员的定义中,可以使用模板形参作为类型或值的占位符,在使用类时再提供那些类型或值的具体信息。由于类模板包含类型参数,因此又称为参数化的类。利用类模板可以建立支持各种数据类型的类。类模板的语法格式template <typename 类型参数1, typename 类型参数2, ..., typename 类型参数N>class 类名。

2024-11-05 13:48:45 1049

原创 大话C++:第25篇 函数模板

函数模板定义在C++中创建了一个可以处理多种数据类型的通用函数框架。通过函数模板,可以编写一个函数,使其能够接受不同类型的参数,并根据这些参数的类型生成相应的函数实例。template关键字:它告诉编译器接下来的代码将定义一个模板。模板参数列表:用尖括号< >包围,里面包含一个或多个模板参数。这些参数是表示类型的占位符。函数返回类型:它可以是任何类型,包括模板参数类型。函数名:与普通函数一样,函数模板也需要一个名称。函数参数列表:它定义了函数接受的参数,这些参数的类型可以是模板参数类型或其他类型。

2024-10-30 19:46:34 726

原创 大话C++:第24篇 文件

文件是指一组相关数据的有序集合,这个数据集的名称叫做文件名。文件通常是驻留在外部介质(如磁盘等)上的,在使用时才调入内存中来,这就是为什么对文件操作时需要打开和关闭的原因。根据数据的存储方式,文件可以分为二进制文件和文本文件。二进制文件直接存储二进制数据,可以节省外存空间和转换时间,但一个字节并不对应一个字符,不能直接输出字符形式。文本文件是以二进制字符编码形式存储信息的文件,常用的字符编码如ASCII码、Unicode码等。文本文件便于对字符进行逐个处理,也便于输出字符。

2024-10-30 19:40:55 906

原创 大话C++:第23篇 输入输出

C++输入输出(I/O)是C++编程语言中非常重要的一部分,它涉及到从外部设备(如键盘、文件等)读取数据以及将数据写入到这些设备中。C++提供了一套丰富的I/O库,程序员可以使用这些库来执行各种输入输出操作。C++的I/O操作主要依赖于<iostream>头文件,它定义了用于输入输出的基本类型和函数。流(Streams):C++的I/O操作基于流的概念。流是一个字符序列,可以从中读取数据或向其中写入数据。

2024-10-24 14:26:33 853

原创 大话C++:第22篇 string高频操作

字符串比较是基于字符的Unicode值进行的,因此,对于非ASCII字符,比较的结果可能会与我们想象的不同,特别是当涉及到不同的字符编码或本地化设置时。在C++中,将数字转换为字符串通常使用标准库提供的函数,这些函数以简单直观的方式执行转换。如果找到,它返回子字符串或字符的起始位置的索引;,它返回字符串中字符的数量,不包括结尾的空字符(null character)。如果返回的值是0,那么字符串就是空的。函数,它接受一个数字作为参数,并返回一个表示该数字的字符串。类似,但是它从字符串的末尾开始向前查找。

2024-10-24 14:17:46 588

原创 大话C++:第21篇 string详解

C++ 的类是 C++ 标准库中的一个重要组件,用于表示和操作字符串。类提供了许多有用的成员函数,允许你执行各种字符串操作,如连接、比较、搜索、替换、插入和删除等。类是定义在<string>头文件中的。要使用类型及其相关的函数和操作符,我们需要在源代码文件中包含该头文件。

2024-10-19 14:36:11 806

原创 大话C++:第20篇 多继承与菱形继承问题

多继承是面向对象编程中的一个概念,指的是一个类可以继承自多个父类。通过多继承,子类可以获取多个父类的属性和方法,从而实现代码的重用和功能的扩展。多继承的其中,Derived类同时继承了Base1和Base2类的成员Derived类的对象可以访问Base1和Base2类中定义的所有公有(public)和受保护(protected)成员。然而,多继承也引入了一些复杂性和潜在的冲突。:当两个基类都从同一个类继承,并且一个类同时继承自这两个基类时,就可能出现菱形继承。

2024-10-19 14:29:06 594

原创 大话C++:第19篇 类继承下的若干关系

在继承中,同名函数指的是派生类中的函数与基类中的函数具有相同的名称,但它们可以是不同的函数签名(参数类型和数量不同)或甚至是相同的函数签名。如果基类没有默认构造函数(即没有不带参数的构造函数),而派生类的构造函数没有使用成员初始化列表来调用基类的某个构造函数,那么编译器将会报错,因为派生类的构造函数试图调用基类的一个不存在的默认构造函数。当派生类中的同名函数与基类中的函数具有相同的函数签名时,派生类中的函数会隐藏(或遮蔽)基类中的同名函数。,顺序非常重要:首先调用派生类的析构函数,然后是基类的析构函数。

2024-10-15 14:07:27 844

原创 大话C++:第18篇 类继承与派生

类继承(Class Inheritance)是面向对象编程(Object-Oriented Programming,OOP)中的一个核心概念。它允许我们创建一个新的类(子类或派生类),该类继承了另一个已存在的类(父类或基类)的属性和方法。这样,子类可以重用父类的代码,而无需重新编写。为什么会有类的继承呢?代码重用: 继承允许我们创建一个新的类,这个新类继承自一个已存在的类,从而重用那个类的代码。这意味着我们不需要从头开始编写所有代码,而是可以继承已有的代码,并在此基础上进行扩展或修改。

2024-10-15 13:58:51 1001

原创 大话C++:第17篇 运算符重载

几乎 C++ 中所有的运算符都可以重载,但运算符重载的使用时相当受限制的。通过运算符重载,可以自定义运算符的行为,使其在作用于用户自定义的数据类型时具有特定的意义。运算符重载只是一种语法上的方便,它并不是创建新的运算符,而是对已有的运算符进行重新定义。重载运算符的目的是为了增强代码的可读性和表达能力,而不是为了创建新的运算符。关键字,后跟要重载的运算符符号。重载的运算符函数可以作为类的成员函数或非成员函数进行定义。被重载了以模拟函数调用的外观,但它仍然是一个类的成员函数,并且遵循成员函数的调用规则。

2024-10-12 14:10:38 1088

原创 大话C++:第16篇 赋值运算符

在C++中,赋值运算符(assignment operator)是一个特殊的成员函数,用于将一个对象的内容赋值给另一个对象。默认情况下,编译器会为类生成一个赋值运算符。自定义赋值运算符的类成员函数语法格式其中,ClassName是你的类名rhs是“right-hand side”的缩写,代表赋值运算符右边的对象。函数返回一个引用到调用对象(即左侧的对象)public:// 默认构造函数Person()// 构造函数// 赋值运算符的重载// 防止自赋值// 复制其他对象的成员值。

2024-10-12 14:01:45 1280

原创 大话C++:第15篇 友元

友元(Friend)是C++中的一个特殊概念,它允许一个类或函数访问另一个类的私有和保护成员。友元可以是一个函数,也可以是一个类。

2024-10-09 10:07:13 1026

原创 大话C++:第14篇 静态类成员

在C++中,静态成员(包括静态成员变量和静态成员函数)是类的一部分,但它们的行为与普通的非静态成员不同。静态成员是与类本身相关联的,而不是与类的任何特定对象实例相关联的。这意味着无论创建多少个类的对象,都只有一个静态成员的副本。

2024-10-09 10:01:39 1298

原创 大话C++:第13篇 this指针

this指针是C++中的一个特殊指针,它隐含在每一个非静态成员函数中,指向调用该函数的对象。这个指针提供了对调用对象自身的访问,使得在成员函数中能够访问对象的成员变量和其他成员函数。this指针的语法格式// this指针本身this// this指针的成员。

2024-09-24 11:58:56 230

原创 大话C++:第12篇 构造函数与析构函数

C++构造函数是一种特殊的成员函数,用于初始化类的对象。当创建对象时,构造函数会自动执行,且只执行一次。它主要用于设置对象的初始状态或执行一些必要的初始化操作。

2024-09-24 11:47:28 1458

原创 大话C++:第11篇 类的定义与封装

在C++中,类的定义通常使用class关键字开始,后面紧跟类的名称。类可以包含数据成员(变量)和成员函数(方法)。在C++中,类可以更加详细地展开,包括数据成员(变量)的声明、成员函数的声明与定义、构造函数、析构函数、内联成员函数、静态成员、友元函数等。类定义的其中,构造函数和析构函数用于对象的初始化和清理。成员函数可以是公共的、受保护的或私有的。静态成员(函数和变量)属于类本身,而不是类的任何特定对象。友元函数和友元类可以访问类的私有和保护成员。

2024-09-20 11:54:22 955

原创 大话C++:第10篇 类与对象

面向过程编程(Procedural Programming)是一种编程范式,它侧重于通过过程(函数或子程序)来解决问题。在面向过程编程中,程序被分解为一系列的过程,每个过程执行一个具体的任务,并通过调用这些过程来实现程序的整体功能。面向过程编程的特点:模块化:程序被划分为一系列独立的函数或过程,每个函数或过程负责执行特定的任务。顺序执行:程序按照预定的顺序执行函数或过程。数据传递:函数或过程之间通过参数传递数据。

2024-09-20 11:50:51 1401

原创 大话C++:第9篇 引用

C++中新增了一种复合类型,引用变量。引用是已定义的变量的别名。通过这个别名和原来的名字都能够找到同一份数据。引用在定义时必须被初始化,并且一旦初始化后,就不能再指向其他变量。引用的声明语法格式其中,type是变量的类型ref是引用的名称var是已经存在的变量在这个声明中,ref就是var的一个引用,或者说别名,对ref的任何操作都会反映到var上。引用类似于Windows中的快捷方式,一个可执行程序可以有多个快捷方式,通过这些快捷方式和可执行程序本身都能够运行程序。

2024-09-18 11:14:00 947

原创 大话C++:第8篇 函数重载

函数重载(Function Overloading)是C++中的一个重要概念,它允许在同一作用域内声明多个同名函数,但这些函数的参数列表(即参数的个数、类型或顺序)必须不同。例如,如果一个函数有两个参数,其中第二个参数有默认值,那么它实际上可以被视为一个接受一个或两个参数的函数,这可能会与另一个只接受一个参数的函数产生冲突。函数模板是在编译时根据实参类型生成具体的函数版本,而函数重载则是通过不同的函数名(实际上是修饰后的函数名)来区分不同的函数版本。如果两个函数的参数列表完全相同,它们就不能构成重载。

2024-09-18 11:06:57 657

原创 大话C++:第7篇 函数参数默认值

函数参数默认值的基本用法是在调用函数时,如果没有提供某个参数的值,则使用该参数的默认值。函数参数的默认值是指在函数定义时,为参数指定一个默认值。当调用该函数时,如果没有给参数传递值,则会使用该参数的默认值。默认值的生效条件:只有当函数调用时没有提供该参数的值时,才会使用默认值。如果提供了该参数的值,则使用提供的值。设置默认值的小技巧:在设置默认值时,应该考虑参数的常见值和合理范围,以及程序的健壮性和可维护性。函数的默认参数从左向右,如果一个参数设置了默认参数,那么这个参数之后的参数都必须设置默认参数。

2024-09-06 15:29:01 392

原创 大话C++:第6篇 命名空间namespace作用域

在C++中,命名空间(namespace)是一个封装了一组名称的容器,这些名称可以是变量、函数、类、类型别名、枚举、模板等。命名空间提供了一种避免名称冲突的方法,允许开发者将相关的代码组织在一起,并在必要时将它们与其他代码隔离开来。命名空间的定义使用namespace关键字后跟一个标识符(即命名空间的名称)。命名空间可以包含其他命名空间,从而形成命名空间的嵌套结构。Project/其中,namespace_a.h (头文件)

2024-09-06 15:25:15 1195

原创 大话C++:第5篇 再识作用域

C++中的作用域(Scope)指的是变量、函数或其他标识符的可见和可访问的范围。C++中有多种作用域,包括:全局作用域(Global Scope):在全局作用域中声明的变量和函数在整个程序中都是可见的。它们可以在程序的任何位置被访问,除非它们在其他的局部作用域中被重新定义。局部作用域(Local Scope):在函数或代码块内部声明的变量和函数具有局部作用域。它们只能在声明它们的函数或代码块内部被访问。当函数或代码块执行完毕后,这些变量和函数将不再存在。

2024-08-31 14:03:18 785

原创 大话C++:第4篇 C++增强型struct

上述代码中,student结构体成员变量无法赋值默认值,除非,定义具体结构体变量时,直接对该变量初始化。除了用于封装多个不同类型的数据成员,还可以包含成员函数,这些函数可以操作结构体的成员变量。只能定义成员变量,不能定义成员函数。例如,定义学生结构体。在语法上是相似的,只是默认的访问权限不同。内部显式地指定成员的访问权限。

2024-08-30 11:05:25 373

原创 大话C++:第3篇 C++数据类型

C++中的宽字符变量的定义使用wchar_t数据类型表示,语法格式wchar_t 变量名 = 宽字符字面量;其中,宽字符字面量是以L或l(通常是大写)开头的字符。int main()// 定义一个宽字符变量,并用宽字符字面量初始化wchar_t wideVar = L'你';// 使用 wcout 输出宽字符std::wcout

2024-08-30 11:02:47 917

原创 大话C++:第2篇 C++编译器

C++语言的编译器是将C++源代码转换为机器可执行代码的工具。以下是一些广泛使用的C++编译器:GNU Compiler Collection (GCC):GCC是一个自由软件编译器集合,支持C、C++、Objective-C、Fortran、Ada和Go等多种编程语言。它是最流行的开源C++编译器之一,广泛用于各种操作系统和平台上。Clang:Clang是基于LLVM的C、C++、Objective-C和Objective-C++编译器前端。

2024-08-28 11:08:12 1328

原创 大话C++:第1篇 C++语言概述

C++是由C语言扩展升级而来,最早于1979年由本贾尼·斯特劳斯特卢普在AT&T贝尔工作室研发。C++在继承了C语言过程化程序设计特性的基础上,进一步扩充和完善了C语言,引入了面向对象的程序设计概念,如抽象数据类型、继承和多态等。这使得C++在面向对象程序设计方面具有强大的能力,同时它也可以进行基于过程的程序设计。

2024-08-28 11:00:59 1246

原创 大话C语言:第46篇 C语言项目工程化之Makefile详解

make是一个命令行工具和构建自动化工具,主要用于管理和构建软件项目。它通过Makefile文件来定义构建任务和依赖关系,并根据这些规则自动执行任务以生成最终的目标文件。Makefile中包含了目标、依赖关系和相应的构建命令。make工具会根据目标和依赖关系来确定构建顺序,并执行构建命令以生成新的目标文件。这使得make能够根据代码的依赖关系自动构建并更新目标文件,从而提高编译效率。make具有依赖管理功能,可以确保任务的正确构建顺序。它支持任务并行执行,并可以在多种操作系统上运行。

2024-08-24 13:56:35 1118

原创 大话C语言:第45篇 文件操作

C语言中,使用fopen函数来打开文件。该函数接受两个参数:文件路径和打开模式(如"r"表示只读,"w"表示写入,"a"表示追加等)。如果文件打开成功,fopen返回一个非空的文件指针;否则返回NULL。:C语言提供了多种函数用于文件的读写操作,如fgetcfgets用于从文件中读取字符或字符串,fputcfputs用于向文件中写入字符或字符串。此外,还有fread和fwrite函数用于读写二进制数据。:C语言中的fseek函数用于移动文件位置指针到指定位置,从而实现对文件的定位。

2024-08-22 10:34:32 1232

原创 大话C语言:第44篇 文件

文件是计算机操作系统中用于存储数据的一种重要构造。在物理层面,文件通常存储在硬盘、闪存或其他持久性存储介质上。在逻辑层面,文件是由一系列记录(如字符、字节、数据块等)组成的,这些记录按一定的格式和顺序排列,用于存储程序或数据。:每个文件都有一个唯一的名称,用于标识和引用该文件。文件名通常由字母、数字、下划线和特定字符组成,并遵循操作系统规定的命名规则。:文件可以根据其内容或用途进行分类,如文本文件、二进制文件、图像文件、音频文件等。不同的文件类型有不同的存储格式和处理方式。

2024-08-22 10:25:46 668

原创 大话C语言:第43篇 结构体的位域

位域是结构体中的一个特殊成员,它允许我们指定该成员所占用的位数,而不是使用完整的字节或更大的单位。这在需要精确控制数据在内存中的布局时特别有用,例如在网络编程或硬件接口编程中。构体中的一个位域字段必须存放在一个存储单元中,不能跨两个单元。如果第一个单元空间不能容纳下一个位段,则该空间不用,而从下一个单元起存放该位段。结构体中的位域字段在赋值时,不要超出位段定义的范围;例如,struct BitFields中的flag1只有一位,取值只能是0或者1。int的位段,位段不能大于32位。

2024-08-20 14:51:56 388

原创 大话C语言:第42篇 结构体内存分配原则

每一个元素存入内存时,都会认为内存是以自己的宽度来划分空间的,因此元素存放的位置一定会在自己大小的整数倍上开始。vc6.0和Visual Studio环境下,8字节对齐,即存放double型变量的起始地址,必须是8的倍数,double变量占8字节。在64位系统下,以8字节为单位开辟内存。long int 在32位平台下,4字节对齐 ,即存放long int 型的变量,起始内存单元的编号是4的倍数即可。gcc环境下,4字节对齐,即存放double型变量的起始地址,必须是4的倍数,double变量占8字节。

2024-08-20 14:48:31 1065

原创 大话C语言:第41篇 结构体与函数的关系

将结构体的值拷贝一份传递给函数,函数内部对该结构体的修改不会影响到原来的结构体变量。将结构体的地址传递给函数,函数内部可以通过该地址来访问原变量,并对其进行修改。

2024-08-15 20:32:32 459

原创 大话C语言:第40篇 结构体指针​

结构体指针是C语言中一种特殊的指针类型,它指向一个结构体变量。结构体指针可以用来访问结构体的成员,同时也可以作为函数参数进行传递,以便在函数内部操作结构体的数据。结构体指针的定义方式与定义其他类型的指针类似,只是指针的数据类型是结构体类型。结构体指针访问或者修改结构体成员,

2024-08-15 20:29:14 403

原创 大话C语言:第39篇 结构体数组​

结构体数组是一种特殊类型的数组,每个数组元素都是一个完整的结构体,包含结构体的所有成员。

2024-08-10 11:41:17 243

空空如也

空空如也

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

TA关注的人

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