
C&C++
文章平均质量分 76
WolvenSec
这个作者很懒,什么都没留下…
展开
-
C/C++:指针数组与数组指针
指针数组:数组中的每个元素都是指针。,表示一个数组,数组内有 5 个指针,每个指针指向int类型的数据。数组指针:一个指向数组的指针。,表示一个指向含有 5 个int类型元素的数组的指针。原创 2024-10-23 14:42:29 · 412 阅读 · 0 评论 -
C++:异常
C++ 异常处理机制是一种用于处理程序运行过程中出现异常情况的技术;异常是指程序在运行过程中发生的不正常情况,如除零错误、访问无效内存、文件不存在等。异常处理机制允许程序在发生异常时执行特定的操作,以便使程序更加健壮和可靠。原创 2024-05-15 11:44:57 · 402 阅读 · 0 评论 -
C/C++:Windows动态链接库
动态链接库(Dynamic Link Library,简称DLL)是在运行时加载的库,它们的代码和数据在内存中与目标程序共享;这意味着多个程序可以共享相同的库实例,并且库的代码可以在不重新编译目标程序的情况下更新。原创 2024-05-14 16:43:34 · 1278 阅读 · 0 评论 -
C/C++:Windows中的静态链接库
文件通常是由编译器生成的,它们包含了函数、变量以及其他符号的定义和实现。在编写代码时引用这些静态连接库时,编译器会将所需的函数和数据从库中提取出来,并将它们直接嵌入到最终的可执行文件中。这意味着最终的可执行文件包含了程序所需的所有函数和数据,因此它在运行时是完全独立的。首先打开项目文件夹,并将生成的.lib文件和相关头文件放入项目文件夹中。文件是一种用于存储静态链接库的格式,其中包含了编译后的二进制代码以及相应的符号信息。静态链接器会将库中使用到的函数和数据复制到目标程序中,创建一个单独的可执行文件。原创 2024-05-13 18:27:43 · 602 阅读 · 0 评论 -
C++:友元
友元(friend)是 C++ 中的一个关键字,用于建立类之间的友好关系;通过友元关系,一个类可以授权其他类或函数访问其私有成员或受保护成员,从而突破了 C++ 中的封装性;友元可以是类或函数,可以出现在类的声明中,也可以出现在类的外部,在声明中,友元关键字表明了某个函数或类是另一个类的友元,从而被授权访问该类的私有或受保护成员。友元关系为双向授权,即如果类 A 是类 B 的友元,但是类 B 不一定是类 A 的友元。原创 2024-05-12 13:25:27 · 588 阅读 · 0 评论 -
网络基础-ICMP协议
1,发送数据包: Traceroute发送一系列的UDP数据包(在Unix/Linux系统上,默认使用UDP,而在Windows系统上则默认使用ICMP)到目标主机,每个数据包的TTL(生存时间)逐渐增加。Traceroute的输出通常会显示每个路由器的IP地址、主机名(如果可解析)、每个路由器的响应时间(通常以毫秒为单位),以及整个路径的总响应时间。它通过发送一系列的数据包,并记录每个数据包经过的路由器,从而帮助用户了解网络中的延迟和网络拓扑。较低的RTT通常表示更快的网络连接。原创 2024-05-11 01:15:02 · 1173 阅读 · 1 评论 -
C++:虚函数表Hook
在C++中,虚函数表是用于实现动态多态性的重要机制,每个对象都有一个指向虚函数表的指针,该表中存储了虚函数的地址,通过修改这个虚函数表(即替换虚函数表中存储的函数指针),我们可以改变类的行为,使其调用不同的函数。由于在内存中虚函数表具有保护属性,是不可写的,所以在Windows环境中我们要进行虚函数表Hook需要通过调用Windows API中的一个函数。虚函数表Hook是一种强大而灵活的技术,可以用于实现各种高级功能,但需要谨慎使用,并且要对目标程序的内部结构有深入的了解。原创 2024-05-11 01:11:48 · 967 阅读 · 0 评论 -
C++:多态-虚析构和纯虚析构
指向一个派生类对象时,如果基类的析构函数不是虚函数,那么只会调用基类的析构函数而不会调用派生类的析构函数,这可能导致资源泄漏。但是,由于基类的析构函数是虚函数,因此在删除派生类对象时,会首先调用派生类的析构函数,然后再调用基类的析构函数,确保释放了所有的资源。它在派生类中可以被重写,并且当通过基类指针删除派生类对象时,可以确保派生类的析构函数被正确调用。虚析构函数在面向对象设计中很常见,特别是当使用继承和多态时,它可以确保在销毁派生类对象时正确调用派生类的析构函数。类,并实现了纯虚析构函数的析构逻辑。原创 2024-05-10 00:38:53 · 373 阅读 · 0 评论 -
C++:纯虚函数
在 C++ 中,纯虚函数(pure virtual function)是一个在基类中声明为纯虚函数的虚函数(如果对虚函数不了解可以去我上一篇文章:C++:虚函数)。它在基类中没有默认实现,而是要求派生类提供实现。通过声明一个函数为纯虚函数,可以使基类成为抽象类,不能实例化,但可以作为其他类的基类。在这个例子中,Animal类中声明了一个纯虚函数,这使得Animal类成为了抽象类,不能被实例化。原创 2024-05-09 00:23:32 · 508 阅读 · 1 评论 -
C++:多态-虚函数
C++ 中的多态性是面向对象编程中的一个重要概念,它允许在运行时选择不同的函数实现,以适应不同类型的对象。原创 2024-05-08 00:41:54 · 1917 阅读 · 2 评论 -
C++:多继承&虚继承
在C++中,虚继承(Virtual Inheritance)是一种特殊的继承方式,用于解决菱形继承(Diamond Inheritance)问题。菱形继承指的是一个类同时继承自两个或更多个具有共同基类的类,从而导致了多个实例同一个基类的实例的冗余。原创 2024-05-07 00:05:21 · 1025 阅读 · 0 评论 -
C++:多态-重写和重载
重写(Override)和重载(Overload)是面向对象编程中常用的两个概念,它们虽然都涉及到方法的定义,但是在实现和使用上有着不同的特点。原创 2024-05-06 00:17:39 · 669 阅读 · 0 评论 -
C++:继承-继承权限
在C++中,类的权限分为公有、私有和保护三种。这些权限控制了类的成员(数据成员和成员函数)对外部代码的可见性和访问性。在 C++类的继承中,也对应着三种继承权限,分别是公有继承(public inheritance)、保护继承(protected inheritance)和私有继承(private inheritance)。这些权限决定了派生类如何继承基类的成员以及外部访问的方式。原创 2024-05-05 00:04:39 · 1094 阅读 · 2 评论 -
C++:继承
C++中的继承使用关键字class后跟一个冒号,然后是要继承的类的名称。在继承中,子类会继承父类的成员(字段和方法),这些成员在子类中可以直接使用,就好像它们是子类自己的一样。子类可以通过扩展或修改继承来自父类的成员,或者添加新的成员和方法。这使得在应用中可以轻松地建立层次化的类结构。:也称为父类或超类,是继承关系中位于上层的类。基类定义了一个或多个子类(派生类)所共有的属性和方法。基类的对象通常是更抽象或更泛化的概念,而不是具体的实例。:也称为子类或继承类,是继承关系中位于下层的类。原创 2024-05-04 01:28:32 · 673 阅读 · 0 评论 -
C++:输入输出运算符重载
在C++中,输入输出运算符是用于从标准输入设备(通常是键盘)读取数据或将数据输出到标准输出设备(通常是屏幕)的运算符。>>用于从输入流(如键盘或文件)中读取数据,并将其存储到变量中。<<用于将数据发送到输出流(如屏幕或文件)以供显示。当你需要使用输入输出运算符(<< 和 >>)重载来对自定义类型进行输入输出时,你通常需要考虑两个方面:输出运算符重载:你可以使用输出运算符(<<)重载来定义如何将对象的信息输出到流中,比如输出到标准输出流(cout)或文件流中。原创 2024-05-03 00:17:46 · 1412 阅读 · 0 评论 -
C++:运算符重载(=/==)
在赋值运算符的重载函数中,首先进行了数值的赋值操作,即将右侧对象的整数成员变量值赋给了左侧对象的相应成员变量。类中包括了两个构造函数:一个是默认构造函数,另一个是带有三个参数的构造函数,用于初始化对象的成员变量。通过重载赋值运算符,可以自定义对象的赋值操作,以便适应特定的需求和语义。注意:使用重载后的赋值运算符时不能将对象的声明与赋值运算符写在一行代码中,即不能在声明对象时初始化对象,如。注意:使用重载后的赋值运算符时不能将对象的声明与赋值运算符写在一行代码中,即不能在声明对象时初始化对象,如。原创 2024-05-02 00:37:43 · 2206 阅读 · 0 评论 -
C++:自增运算符(++)重载
自增运算符(++)分为前置自增和后置自增,它们两者主要的区别是:返回的值不同,以及执行自增操作的顺序不同。++前置自增运算符首先将操作数加1,然后返回自增后的值。这意味着如果你使用前置自增运算符对一个变量进行操作,你会在其他任何操作之前得到自增后的值。++后置自增运算符也会将操作数加1,但是它会返回自增前的值。这意味着如果你使用后置自增运算符对一个变量进行操作,你会在其他任何操作之后得到自增前的值。原创 2024-05-01 00:35:02 · 1833 阅读 · 2 评论 -
C++:运算符重载-加号(+)
接下来就以加号(+)为例子,阐述如何对双目运算符进行重载。原创 2024-04-30 00:14:40 · 834 阅读 · 1 评论 -
C++:string 类
在C++中定义一个无论采用哪种方式,都可以创建一个类型的字符串。选择哪种方式取决于代码的需求和个人偏好。原创 2024-04-29 00:00:00 · 946 阅读 · 0 评论 -
C++:常函数
在C++中,常函数(const member functions)是指在类的成员函数声明和定义中使用const关键字修饰的函数。常函数的存在主要是为了在类的实例上提供一种保证:该函数不会修改类的成员变量。在类的成员函数声明中,如果函数不会修改类的成员变量,可以将其声明为常函数。原创 2024-04-28 00:16:41 · 1360 阅读 · 0 评论 -
C++:浅拷贝和深拷贝
深拷贝(Deep Copy)和浅拷贝(Shallow Copy)是在编程中经常遇到的两种复制数据的方式,它们在操作上有着明显的区别。原创 2024-04-27 00:30:24 · 1013 阅读 · 0 评论 -
C++:静态成员变量和静态成员方法
静态成员方法的声明和定义方式与普通成员方法类似,但在声明和定义时需要在前面加上static关键字。public://静态成员变量//静态成员函数//构造函数(调用静态成员方法)std::cout << "构造函数" << std::endl;原创 2024-04-26 00:06:44 · 451 阅读 · 0 评论 -
C++:匿名对象
在C++中,匿名对象是指在不分配给定变量名称的情况下创建的临时对象。这些对象通常用于传递参数给函数、作为函数的返回值或者在表达式中使用。原创 2024-04-25 18:51:42 · 511 阅读 · 2 评论 -
C++:拷贝构造函数的初始化列表
拷贝构造函数的初始化列表是在拷贝构造函数的定义中出现的一组初始值,用于初始化新创建的对象的成员变量。它的语法是在构造函数的声明后面使用冒号()来开头,然后列出要初始化的成员变量和它们的初始值。初始化列表的优点在于它允许在对象构造之前对成员变量进行初始化,并且可以直接初始化成员变量,而不是先调用默认构造函数再进行赋值。这样可以提高效率,避免不必要的额外操作。原创 2024-04-25 00:39:45 · 534 阅读 · 0 评论 -
C++:this指针
this是一个指向当前对象的指针,它可以在类的成员函数中使用。它是每个类的非静态成员函数的隐含参数;当你在类的成员函数中使用this时,它指向调用该函数的对象。主要作用是让类的成员函数能够访问对象的成员变量和其他成员函数。因为每个对象都有自己的成员变量,所以需要一种方法来确定成员函数是在哪个对象上调用的,这就是this指针的作用。原创 2024-04-24 00:11:36 · 1194 阅读 · 3 评论 -
C++:特殊成员函数
此时我在创建roleA对象时调用其构造函数进行成员初始化,将roleA对象的m_nHP值设置为44,接着实例化对象roleB,且调用拷贝构造函数,将对象A作为拷贝对象进行传入;它通常用于对象的复制或传递。此时我先实例化一个对象roleA,接着再创建一个对象roleB,且再创建对象B的时候调用拷贝构造函数进行对象的复制与传递;构造函数在对象创建时自动调用,一般我们会在构造函数中针对对象的成员变量进行初始化,这个时候就可以对构造函数进行。可以看到对象的构造函数在创建对象时执行,析构对象在释放对象时执行。原创 2024-04-23 00:30:52 · 1241 阅读 · 0 评论 -
C++ 面向对象-封装
C++ 是一种多范式编程语言,它支持面向对象编程(OOP)范式。面向对象编程是一种程序设计思想,其中程序由对象组成,每个对象都是一个实例,具有数据和相关操作。在C++中,实现面向对象编程主要通过类和对象。:类是一种用户定义的数据类型,用于封装数据和操作。类可以看作是对象的蓝图或模板,描述了对象的属性(成员变量)和行为(成员函数)。C++ 中的类是一种用户定义的数据类型,用于封装数据和相关操作。类可以看作是一种模板,描述了数据的结构和如何对数据进行操作。在类中,可以定义成员变量(数据)和成员函数(操作)原创 2024-04-22 00:11:39 · 1305 阅读 · 0 评论 -
C++:范围-based for 循环
范围-based for 循环是 C++11 引入的一种循环语法,它简化了遍历容器和数组等序列的操作,使代码更加清晰和简洁。它通常用于遍历容器类(如数组、向量、列表等)中的元素,或者以范围的形式遍历初始化列表。范围-based for 循环对于遍历容器类中的元素非常方便,并且代码更加简洁易读,特别适用于不需要索引信息的情况下。中的每个元素并输出。在每次循环迭代中,变量。是容器中的每个元素,在每次循环迭代中,中的每个元素值,每个元素占据一行。将分别代表容器中的每个元素的值。中的每个元素的值,然后通过。原创 2024-04-21 12:22:24 · 623 阅读 · 0 评论 -
C++:引用
C++中的引用是一种别名,允许开发者在程序中使用已存在的变量名称来引用另一个变量。引用提供了一种简洁的方法来操作变量,而不需要复制数据本身。引用使用符号声明,并在初始化时绑定到另一个变量。引用一旦初始化后,就不能再绑定到另一个对象。原创 2024-04-20 00:29:15 · 693 阅读 · 0 评论 -
C++动态内存
堆上的内存分配和释放是由程序员手动管理的,需要程序员调用相应的函数来分配和释放内存。用于在堆上动态分配原始的、未初始化的内存块,它返回一个指向分配内存区域的指针,不涉及对象的构造和初始化。:栈上分配的内存的生命周期与函数调用的生命周期密切相关,当函数调用结束时,栈上的局部变量会被自动销毁。用于在堆上动态分配对象的内存,它可以调用对象的构造函数进行初始化,并返回指向对象的指针。分配的对象或数组的内存,它的参数是一个指向对象或数组的指针。函数的参数是一个指向动态分配的内存区域的指针,它的类型是。原创 2024-04-19 00:41:52 · 1067 阅读 · 1 评论 -
C++:文件内容完全读入
在上一篇文章中我留下了一点小坑:使用>>运算符,这个运算符默认将空格作为分隔符,所以在文件内容读取的时候发现在读到空格时就会停止读取,导致读取内容不完整,这显然不符合日常的使用用能,那么今天就来讨论以下如何将文件内容完全读取。原创 2024-04-18 00:26:25 · 782 阅读 · 0 评论 -
C++ - 文件流fstream
C++ 文件流是指在C++编程中使用的用于文件输入输出操作的机制。这种机制允许程序员以类似于流的方式读取和写入文件数据。在C++中,文件流通常使用<fstream>头文件提供的类来实现。常用的文件流类包括:1. std::ofstream:用于向文件中写入数据的输出文件流类。2. std::ifstream:用于从文件中读取数据的输入文件流类。3. std::fstream:std::fstream 是 C++ 标准库中的一个类,用于文件输入输出操作。原创 2024-04-17 00:34:44 · 1825 阅读 · 0 评论 -
C++-命名空间
C++ 命名空间是一种用于组织代码的机制,可以帮助避免命名冲突,提高代码的可读性和可维护性。命名空间将代码分组到逻辑单元中,允许在不同的代码单元中使用相同的名称而不会产生冲突。命名空间通过将代码放置在一个命名空间内部来实现。在 C++ 中,命名空间由关键字 namespace 开始,后面跟着命名空间的名称以及一对大括号,大括号中包含了命名空间内部的代码。原创 2024-04-16 00:37:29 · 847 阅读 · 1 评论 -
C++-基础
C++ 是一种通用编程语言,具有高性能、灵活性和广泛的应用领域。它是在 1979 年由 Bjarne Stroustrup 开发的,最初被称为“C with Classes”,随后在 1983 年正式更名为 C++。C++ 基于 C 语言,同时引入了面向对象编程(OOP)的特性,使得它既可以进行底层系统编程,又能够进行高级的软件开发。C++源代码的后缀尾.cpp。原创 2024-04-15 12:22:18 · 893 阅读 · 0 评论 -
C-更多指针操作
就是指定28为28字节,接着因为要访问的时int类型的成员,所以需要使用(int*)将指针强制转换为int类型的指针,最后使用 * 调用出成员的值。经过成员偏移量的计算可以得到整型成员偏移量为28(在结构体对齐文章中有提到如何进行计算),所以(char。,并为其分配了足够的空间来存储指向整数的指针(5个指针)。则被声明为指向一个包含 4 个整型元素的数组的指针,因此。,指向一个含有 4 个整型元素的数组。数组,打印出每个指针所指向的整数值。,即指向 4 个整型元素的数组的指针。是一个二维数组,而指针。原创 2024-04-08 00:29:44 · 321 阅读 · 0 评论 -
C-结构体对齐
63。原创 2024-04-07 01:28:00 · 1227 阅读 · 0 评论 -
联合&枚举
联合(Union)是C语言中的一种特殊的数据类型,它允许在同一内存位置存储不同类型的数据。与结构体(struct)不同的是,联合的所有成员共享同一块内存空间,因此联合中的每个成员的大小加起来不能超过联合的总大小(联合的总大小就是联合中最大成员的大小)。枚举常常用于提高代码的可读性和可维护性,因为它允许开发人员使用具有描述性的符号来表示特定的值,而不是使用原始的数字或字符串。这意味着,如果联合中的任何成员的大小超过了联合的总大小,那么这个成员将无法完全存储在联合中。MONDAY, // 默认值为0。原创 2024-04-02 14:50:00 · 506 阅读 · 0 评论 -
C-文件操作&异或加密保护文件
if ((pFile = fopen(szFilePath, "r")) == NULL) { //先赋值后判断(pFile = fopen();: 检查实际读取的文件长度是否与预期的文件长度相同。但是在打开文件后发现文件内容呈乱码情况,这个时候可以在打开文件的时候可以指定文件的编码格式。,其作用是从指定的文件路径读取文件内容,并返回一个指向读取内容的字符串指针。原创 2024-04-01 15:05:24 · 1083 阅读 · 0 评论 -
C-结构体 -struct
Eg://定义结构体_PlayerInfoint nHP;float PosX;float PoxY;int main()//创建PlayerInfo类型的结构体,并使用初始化列表进行初始化(szName="wolven",nHP=500,PosX=50.32f,PosY=100.34f)//打印结果为wolven//对某个成员变量进行修改//打印结果为1000//指针指向结构体//声明结构体指针//指针指向PlayObj结构体return 0;原创 2024-03-27 20:41:22 · 563 阅读 · 0 评论 -
C-宏与条件编译探索
define MAX_VALUE 256 (定义常量)Eg:int main()return 0;打印的值为10;这段代码使用了一个宏定义ADD(a),它的定义是a+5。在C语言中,宏定义使用#define来声明,这里的ADD(a)实际上是一个预处理指令,它告诉编译器在编译过程中将所有的ADD(5)替换为5+5。Eg://找出两个数中的最大值a:bint main()return 0;打印结果为10;判断系统环境是Windows系统还是Linux系统。原创 2024-03-27 00:14:02 · 962 阅读 · 1 评论