自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 面向对象+构造、析构、拷贝构造+反转链表

当类中存在虚函数时,编译器会给类增加一个指针类型的成员变量,增加的这个指针变量就是虚函数表指针,创建对象虚表指针就会被创建,并且在构造函数中被赋值,每个对象都有-自己的虚表指针。首先会通过父类指针或引用访问到子类对象中的虚表指针,然后通过虚表指针找到虚函数表通过虚函数表存放的虚函数地址去调用虚函数。一个父类的两个子类是同一个子类的父类,由于中间两个子类都继承于一个父类,那么下面的子类调用共同属性时会有不明确的问题。本质就是模版的具现化,在编译阶段就能确定的多态,静态多态中的接口调用也叫做隐式接口。

2025-02-26 19:21:16 406

原创 数据库三范式

示例:假设有一个 “订单信息” 表,主键是 “订单编号”,表中有 “商品名称”、“商品价格”、“顾客姓名”、“顾客地址” 这些列。这种情况下应该把 “顾客姓名” 和 “顾客地址” 等顾客相关信息拆分到 “顾客信息” 表中,通过 “顾客编号”(假设顾客信息表主键是顾客编号)与 “订单信息” 表建立关联。“部门名称” 依赖于 “部门编号”,而 “部门编号” 是和 “员工编号” 相关联的非主属性,所以 “部门名称” 通过 “部门编号” 间接依赖于 “员工编号”,不符合第三范式。也就是说,一张表只描述一件事情。

2024-12-22 14:04:47 380

原创 排序算法:冒泡排序

最优情况下:O(n)(本身就是有序的,只进行一次排序,n-1次比较)每一次顺序便遍历,比较相邻的两个元素,交换。稳定性分析(大小相同的值顺序变不变):稳定。//内层i针对当前排序区间进行冒泡操作。//外层j控制的是待排序区间的长度。//提高效率,判断比较好了就结束。最差情况下:O(n2)

2024-12-21 15:04:48 325

原创 C++ 中对象创建与销毁的时机处理

/ 首次调用func时,staticObj被创建,之后再调用func时不会重新创建。// 调用MyClass的构造函数创建对象,返回指向该对象的指针。// 当执行到这一行时,MyClass的构造函数被调用,obj对象被创建。std::cerr << "无法打开文件用于保存角色状态。std::cerr << "无法打开文件用于加载角色状态。// 调用MyClass的析构函数销毁对象,释放内存。// 程序结束时,globalObj被销毁。

2024-12-21 15:01:42 1041

原创 C++实现工厂模式

实现工厂模式简单工厂模式(以创建图形为例)定义与概念: 简单工厂模式把对象的创建逻辑封装在一个工厂类中,通过传入不同的参数,由工厂类决定创建哪种具体的产品对象,使得客户端代码不需要了解具体产品的创建细节。 实现步骤: 定义产品抽象基类(以图形为例): class Shape {public: virtual void draw() = 0; virtual ~Shape() {}};实现具体产品类(圆形和矩形):class Circle : public

2024-12-20 14:42:07 546

原创 对象克隆与单例模式

时,编译器会调用默认生成的拷贝构造函数,它简单地将p1对象的各成员变量的值复制给p2对象对应成员变量,对于像std::string这样的类类型(它内部已经处理好了深拷贝相关逻辑)能正常工作,但如果成员变量是指针等情况,就可能出现问题(多个对象的指针指向同一块内存区域,后续修改会相互影响),这就是浅拷贝的特点。在 C++ 中,对象克隆通常可以借助拷贝构造函数和赋值运算符重载来实现,分为浅拷贝(默认行为)和深拷贝(需要自定义实现)。// 禁用拷贝构造函数。// 编译器默认生成的拷贝构造函数实现的是浅拷贝。

2024-12-18 14:56:25 673

原创 C++ 中的序列化和反序列化

在 C++ 中,序列化是将对象转换为字节流的过程,反序列化则是从字节流重新构建对象的过程。std::cerr << "无法打开文件进行Boost反序列化。栈对象:在函数内部定义的对象,当程序执行到对象定义处时,会调用对象的构造函数进行创建。栈对象:当栈对象所在的代码块结束时,对象的析构函数会被自动调用,用于清理对象占用的资源。是一个栈对象,它的生命周期从定义处开始,到所在的代码块结束(如函数返回)。使用:在对象的生命周期内,可以通过对象的成员函数访问和修改对象的状态,就像。

2024-12-17 18:53:22 741

原创 实现接口继承与实现继承的区别

当调用一个虚函数(在多态场景下的函数)时,程序需要通过对象的虚函数表指针找到对应的函数地址,这个间接的查找过程会带来一定的性能开销,相比于直接调用非虚函数(在编译阶段就能确定函数地址的函数)会慢一些。接口可以被多个类实现,一个类也可以实现多个接口,这提供了高度的灵活性,能够实现多继承的效果(在一些单继承语言中模拟多继承行为)。指的是一个类(子类)继承另一个类(父类)的成员(包括属性和方法),并且可以选择性地重写(override)父类的方法。在继承过程中,子类可以继承父类的访问修饰符允许的成员变量和方法。

2024-12-15 14:45:33 913

原创 C++内存管理

在函数内部声明的变量默认分配到栈上//局部变量,存储在栈上。

2024-12-14 22:18:28 1755

原创 C++面向对象中数据隐藏和异常处理

这个异常对象可以是基本数据类型,也可以是自定义的类类型。成员在类内部可以访问,在派生类中也可以访问,但在类的外部(非派生类)不能访问。当异常被抛出时,程序的执行流程会立即跳转到相应的。类型的异常对象,其构造函数接受一个字符串参数用于描述异常信息。的成员(数据成员和成员函数)只能在类的内部被访问。如果抛出的是其他类型的异常,则会被最后一个。:用于表示运行时错误,如上述代码中的除零错误。:用于表示逻辑错误,比如非法的参数值等。块(这是一个捕获所有异常的块)捕获。类中被访问和修改,但在类的外部(如。

2024-12-13 15:02:56 493

原创 C++ 中多态性在实际项目中的应用场景

在一个图形绘制软件中,需要绘制多种不同的图形,如圆形、矩形、三角形等。每个图形都有自己的绘制方法,但是它们都可以被看作是一个抽象的 “图形” 概念,并且都有一个共同的操作,比如绘制(draw)。函数,就可以方便地在主程序中进行调用,而不需要对主程序进行大量的修改。// 这里是绘制圆形的具体代码,比如使用图形库绘制一个圆。的指针或引用数组来存储不同类型的图形对象,然后通过循环调用。这样,无论添加多少种新的图形,只要它们继承自。然后针对不同的图形,如圆形。等,派生出具体的类,并实现。,其中包含一个纯虚函数。

2024-12-12 22:11:58 244

原创 C++运算符重载

代码复用性提高:一旦为某个自定义类型重载了运算符,就可以在任何需要使用该运算符操作该类型对象的地方使用。例如,对于上面的复数相加的例子,如果没有运算符重载,可能需要调用一个名为。类重载了算术运算符,那么在库中的各种计算函数都可以方便地使用这些重载后的运算符,而不需要针对每种运算重新编写专门的函数。等运算符,以模拟向量的加法、减法等操作,这样可以使程序的逻辑更加贴近实际的数学和物理模型。的表达方式更加符合数学习惯和人们的直观理解,使得代码的可读性大大提高。,因为相加两个复数后得到的结果是一个新的复数。

2024-12-12 13:05:43 339

原创 纯虚函数与抽象类

当需要添加新的功能或者修改现有功能时,只需要在抽象类和具体的派生类中进行相应的修改,而不会影响到整个程序的其他部分。通过在基类中定义纯虚函数,强制要求派生类必须实现这些函数,从而保证了不同派生类对象在调用相同函数时能够根据自身的特点进行不同的操作。这是因为抽象类中的纯虚函数没有具体的实现,所以对象的行为是不完整的。这些非纯虚函数可以有默认的实现,并且可以在派生类中被继承和调用。它的存在是为了在派生类中被重写,从而提供具体的实现。在实际的软件开发中,抽象类可以用来表示一个抽象的概念或者模型。

2024-12-08 18:53:59 472

原创 面向对象中多态的含义

这样,在使用图形对象的代码部分(如一个图形绘制和面积计算系统),不需要进行大量修改就可以适应新的图形类型。函数重载的概念:在同一个作用域内,可以定义多个同名函数,只要它们的参数列表(参数个数、类型或顺序)不同。类计算面积的精度)时,只需要在该对象的类定义中修改其对应的函数实现,而不会影响到其他对象和使用这些对象的代码。增强代码的可扩展性:以图形计算面积为例,如果要添加新的图形类型(如梯形),只需要从基类。等)共享,同时每个派生类又可以根据自身的特点实现特定的行为(如计算面积)。函数时,实际调用的是。

2024-12-07 16:03:11 420

原创 C++中的继承

例如,有一个继承层次为 A - B - C - D - E,当需要修改某个功能时,可能需要在多个层次的类中进行修改,而且很难追踪这些修改对整个系统的影响。例如,如果有多个类都具有相同的基本属性和行为,如各种几何图形(三角形、矩形等)都有计算面积和周长的行为,都有边长等属性。当需要添加新的功能或者新的类时,只要在继承体系中适当的位置添加新的派生类或者在已有派生类中添加新的成员函数即可。例如,在图形绘制系统中,如果要添加一种新的图形,如菱形,只需要创建一个新的类从图形基类继承,并添加菱形特有的属性和行为即可。

2024-12-06 17:15:53 224

原创 C++中实现的封装性

如果后来发现另一种数据结构更高效,在封装良好的情况下,可以只修改类内部的数据结构和相关操作函数,而不影响使用这个图形绘制类的其他代码。而通过封装,只有经过授权的函数(如通过特定的工资调整流程对应的函数)才能修改工资数据,保证了数据的安全性。在多个不同的应用程序(如日历应用、任务管理应用等)中,如果需要处理日期时间相关的功能,就可以直接复用这个 “日期时间” 类,而不需要重新编写相关的代码。这是实现封装的关键,它隐藏了类的内部细节,防止外部代码对数据的随意访问和修改,保证了数据的安全性和完整性。

2024-12-05 23:16:28 419

原创 linux静态链接和动态链接

静态链接的特点 程序独立性高 静态链接是在程序编译时,将所有需要的目标文件以及它们所依赖的库文件中的代码和数据链接成一个可执行文件。一旦链接完成,这个可执行文件就包含了运行所需的全部内容,不依赖外部的库文件。例如,一个简单的 C 语言程序使用了数学库中的函数,在静态链接时,数学库的相关代码会被复制到最终的可执行文件中。这样,在任何环境下运行这个可执行文件,只要操作系统能够识别这个文件格式,它就可以独立运行,不用担心缺少某些库的支持。 执行效率相对稳定 由于所有的代码和数据在程序运行之

2024-12-04 17:13:28 479

原创 C++隐式类型转换

隐式类型转换的定义 隐式类型转换是指在程序运行过程中,编译器自动将一种数据类型转换为另一种数据类型,而不需要程序员显式地编写转换代码。这种转换通常发生在不同数据类型的操作数进行混合运算或者将一种数据类型的值赋给另一种数据类型的变量时。 例如,在许多编程语言中,当把一个整数和一个浮点数进行相加运算时,整数会被隐式地转换为浮点数。像在 Python 中3 + 4.5,整数3会被自动转换为浮点数3.0,然后再进行加法运算,结果是7.5。 隐式类型转换可能带来的问题 数据精度丢失:当把高精度的数据类型(

2024-12-02 20:42:36 336

原创 C++函数默认参数与重载

在同一作用域,函数名字相同参数不同(个数 种类 顺序、有无const修饰其中一个不同即可),与返回值无关。注:1、c语言不能用函数重载,因为编译方式不同,c++编译函数的时候会将函数重新命名,c语言函数名字不能相同。1、如果当前位置有默认值,那么它右边的所有形参都需要有参数默认值。//此时调用函数时两个重载函数都满足,就会有二义性问题,应该避免。当执行函数时,编译器会根据实参的类型选择合适的函数来调用。在c++中函数形参列表中的变量是可以有默认值的。cout << " 无参";//右边的参数都要有默认值。

2024-12-01 18:55:53 439

原创 C++内存对齐

例如,在硬件设计中,内存地址生成电路可以根据数据类型的对齐要求,简单地通过将基地址加上固定的偏移量(该偏移量是对齐模数的整数倍)来得到下一个数据的有效地址。例如,在网络通信中,当一个程序将一个按照内存对齐规则构建的数据结构发送到另一个程序时,接收程序可以根据已知的数据类型大小和对齐规则准确地提取和解析数据,减少因数据存储格式不一致而导致的错误。例如,假设处理器一次读取 4 字节的数据(一个字,word),如果数据是内存对齐的,那么一次内存读取操作就可以完整地获取到数据。内存对齐是一种计算机内存管理策略。

2024-11-30 18:51:08 345

原创 C++中的自动类型推导

也是 C++ 11 引入的,它的主要作用是用于查询表达式的类型。这在模板编程和泛型编程中非常有用,例如在定义模板函数或者模板类的时候,需要根据传入的参数类型来确定其他相关变量的类型。当一个对象是右值(即将被销毁的临时对象)时,通过移动语义可以高效地将其资源转移给另一个对象,避免不必要的资源分配和复制。而移动构造函数可以直接将临时。假设有一个函数模板,需要返回一个和传入参数类型相同的变量,并且这个变量是传入参数的两倍。的实际类型,正确地返回一个两倍于传入参数值的变量,并且返回值类型与表达式计算后的类型一致。

2024-11-29 17:11:53 728

原创 C++中的volatile 关键字

在这个例子中,shared_variable被声明为 volatile,因为它会在主程序和中断服务程序中被访问和修改。这样可以确保主程序每次读取shared_variable的值时,都是从内存中获取最新的值,而不是使用可能已经被缓存的旧值。在这里,编译器不会假设flag的值一直为 0 而跳过循环,它会每次都从内存中读取flag的值来检查循环条件。// 假设这里启用了中断,并且interrupt_handler会在适当的时候被调用。// 主程序会读取并使用shared_variable的值。

2024-11-29 15:26:21 426

原创 C++中的函数对象

在这个例子中,首先创建了Multiply类的对象multiplyObj,然后通过multiplyObj(3, 4)的方式调用这个对象,就像调用一个函数一样,实现了两个数的相乘并输出结果。可以创建多个不同行为的函数对象类,并且可以方便地在不同的场景中复用这些类。函数对象:函数对象是基于类的,它的类型是类类型。编译器可以在编译时检查类型,包括函数调用运算符的参数类型和返回值类型等,提高了代码的安全性。函数对象:函数对象可以有自己的成员变量,能够在调用之间保存状态,就像前面提到的。函数对象与普通函数的区别。

2024-11-27 21:31:39 413

原创 C++ 中的多继承虚继承

2024-11-26 23:23:02 119

原创 C++ 中的 Lambda 表达式

向量中的每个元素,并将元素传递给 Lambda 表达式,Lambda 表达式计算元素的平方并输出,展示了函数式编程中对数据集合进行批量操作的风格。[&]:表示引用捕获所有在 Lambda 表达式所在作用域中的变量,在 Lambda 函数体中对这些变量的操作都会影响外部的原始变量。有时候我们只需要在一个小的代码块(比如一个函数内部)中定义一个简单的函数来完成特定的任务,Lambda 表达式就很合适。含义:按引用捕获变量,在 Lambda 函数体中对变量的操作会直接影响外部的原始变量。

2024-11-25 21:50:59 1645

原创 C++中的类型别名与using声明

在这里,Base类是Derived类的私有基类,正常情况下Base中的func函数在Derived类外部是不可访问的。但是通过using Base::func声明,在Derived类外部就可以访问func函数了,就好像func是Derived类的一个公有成员一样。在这个例子中,Derived类通过using声明将基类Base中的protectedFunc函数在Derived类中的访问权限变为公有,同时也保留了publicFunc的公有访问权限。声明可以用来改变基类成员的访问权限或者引入基类的隐藏成员。

2024-11-24 16:37:45 828

原创 C++ 中的模板特化和偏特化

当一般的模板定义对于某些特定类型不能满足要求,或者可以提供更高效的实现时,就可以使用模板特化。它不是完全指定模板参数的具体类型,而是对模板参数的某些特性(如指针类型、引用类型、数组类型等)进行特化。(字符串指针)时,上述比较大小的方式就不合适了,因为直接比较指针的值并不能得到字符串内容大小的比较结果。这可以让我们针对指针类型的数组进行特殊的操作,比如更方便地管理指针数组的内存等。还可以对模板参数的其他特性进行偏特化,比如对数组类型。是指针类型时,就会使用这个偏特化的模板类定义,它的数据成员。

2024-11-23 17:46:18 855

原创 C++智能指针

应用场景:当对象的所有权在程序的某个部分明确是独占性的,如在一个函数内部创建一个对象,并且该对象只在这个函数内部使用,当函数结束时对象应该被销毁,比如在一个复杂的数据结构中,多个节点可能需要共享同一个数据块,这时候就可以使用。例如,一个函数创建一个动态分配的文件句柄对象,函数结束时文件句柄应该被自动关闭,就可以用。可以同时指向同一个对象,并且会对这个对象的引用计数进行维护。是一种弱引用智能指针,它不会增加所指向对象的引用计数。来保存对对象的引用,当对象在其他地方被销毁时,缓存中的。有一个引用计数的变量。

2024-11-22 21:25:23 348

原创 C++移动语义

当函数返回一个局部对象时,在没有移动语义的情况下,可能会进行一次拷贝操作来返回这个对象。而有了移动语义,编译器可以优化这个过程,直接将局部对象的资源转移给函数的返回值,避免了不必要的复制。对于资源密集型对象,如文件流对象,移动语义允许高效地转移文件句柄的所有权,而不是重新打开文件并复制相关的缓冲区等资源。对象作为参数传递给一个函数,并且在函数内部不需要保留原始对象的内容,那么使用移动语义可以避免复制整个字符数组。)处于一种有效但未定义的状态,通常它的资源已经被转移,再次使用这个对象时需要谨慎。

2024-11-21 22:21:11 825

原创 C++中的内联函数

内联函数则不同,它是真正的函数,具有函数的特性,包括参数类型检查、返回值类型等。所以,使用内联函数可以在一定程度上达到宏的效果(减少函数调用开销、代码展开),同时又能保证代码的安全性和可读性,因为它遵循函数的语法规则和类型系统。例如,在代码中调用内联函数。普通函数调用会有一定的开销,包括保存当前函数的执行上下文(如寄存器的值、返回地址等)、跳转到被调用函数的地址、传递参数、执行被调用函数、然后再返回等一系列操作。函数,如果它是内联函数,每次调用就不需要执行函数调用的跳转等操作,从而可以提高程序的执行效率。

2024-11-20 18:19:33 777

原创 C++中初始化参数列表

如果不在初始化列表中初始化对象成员或调用基类构造函数,而是在构造函数体内尝试进行相关操作,对于对象成员可能会导致对象先使用默认构造函数进行初始化(如果有的话),然后再重新赋值,这可能会产生不必要的开销,并且可能不符合预期的初始化逻辑。对于类中的对象成员(其他类的对象作为本类的成员),初始化列表提供了一种方便的方式来调用对象成员的构造函数进行初始化。在类继承关系中,派生类的构造函数可以通过初始化列表调用基类的构造函数来初始化从基类继承的成员。类型的成员变量,使用初始化列表可以避免一次不必要的默认初始化过程。

2024-11-20 18:04:57 841

原创 C/C++ 中的类型转换方式

类型转换可能会带来哪些问题?

2024-11-20 14:25:06 227

原创 C++中的常量表达式

这里square是一个constexpr函数,它在编译期就能计算出结果,nine是一个constexpr变量,由square函数的返回值(一个常量表达式)初始化。常量表达式可以作为模板参数使用。模板是 C++ 中实现泛型编程的重要工具,而模板参数可以是常量表达式,这使得可以根据常量的值来定制模板。这里favoriteColor是一个常量表达式,因为枚举类型的值在编译期是确定的。类型在当前平台下的字节数,这个结果在编译时就可以确定,所以它是常量表达式。等)的操作数都是常量表达式时,整个表达式也是常量表达式。

2024-11-20 14:08:50 951

原创 返回值类型和存储位置

返回值类型和存储位置。

2024-11-20 12:36:12 932

原创 C++中的异常处理机制

例如,在一个企业级应用中,数据访问层可能会抛出数据库连接错误的异常,业务逻辑层可以捕获这些异常并转换为对用户更友好的错误消息(如 “系统暂时无法处理您的请求,请稍后重试”)。比如在一个大型的软件项目中,底层的函数可能会抛出一些基础的异常(如文件读写错误、网络连接错误等),而高层的模块可以在一个更合适的位置统一处理这些异常,如显示友好的用户界面错误消息。例如,在一个大型的金融系统中,计算利息的函数可能会有复杂的数学运算,使用异常处理可以将可能出现的输入错误(如负利率)的处理代码与利息计算代码分开。

2024-11-20 12:11:03 540

原创 C/C++中的命名空间

例如,一个命名空间内可能包含一些辅助函数和变量,这些内容是不希望被外部直接访问的,只需要将接口函数放在命名空间外或者以适当的方式暴露出来即可。这样的嵌套结构有助于进一步组织代码,例如可以按照层次结构来区分不同的模块或者功能组,像在一个大型的游戏开发项目中,外层命名空间可以是游戏整体模块,内层嵌套命名空间可以是游戏中的具体系统,如。例如,在一个大型的图形处理程序中,可以将所有与图形绘制相关的函数和类放在一个名为。声明,可以将命名空间中的某个成员引入当前作用域,这样就可以直接使用成员名而不用加上命名空间前缀。

2024-11-20 11:47:58 554

原创 c/c++中的预处理指令

这有助于提高代码的可读性和可维护性,并且可以方便地在代码中使用一些固定的值或常用的表达式。指令是特定于编译器的指令,不同的编译器可能有不同的用法。C/C++ 中的预处理器指令是以#开头的代码行,它们在编译之前对源代码进行处理。这些指令常用于条件编译,可以根据不同的情况编译不同的代码,例如在不同的平台上编译不同的代码版本。#define SQUARE(x) ((x)*(x)) // 定义带参数的宏,计算一个数的平方。这可以用于根据不同的条件(如编译器选项、平台特定的定义等)编译不同的代码逻辑。

2024-11-10 11:56:08 430

原创 c++中的循环引用

这可能会进一步引发问题,比如在析构函数中有释放资源(如关闭文件、释放网络连接等)的操作,如果析构顺序混乱,可能会导致资源不能及时或正确地释放。场景中,这两个对象的内存无法被正确释放,因为它们形成了一个孤立的环,垃圾回收机制(如果有的话)或手动释放内存时无法识别它们不再被程序的其他部分使用。在这个例子中,类A的对象包含一个指向类B对象的指针,类B的对象又包含一个指向类A对象的指针,形成了循环引用。在 C++ 中,循环引用是指两个或多个对象相互持有对方的指针或引用,从而形成一个环状的引用关系。

2024-11-08 15:35:15 471

原创 函数模版与类模板

这里template关键字表示开始定义模板,<typename T>(或<class T>)声明了一个类型参数T,函数myFunction使用这个类型参数,它可以接受两个相同类型T的参数,并返回它们相加的结果(这里假设T类型支持+操作)。在这个例子中,printData函数是一个函数模板,它接受一个MyClass类型的对象,这里MyClass的类型参数T在printData被调用时根据传入的MyClass对象的实际类型确定。函数模板的实现方式,所有使用该模板的地方都会受益,而不需要逐个修改针对不同类型的。

2024-11-08 15:05:36 795

原创 new和malloc的区别

类型的指针,需要进行强制类型转换才能得到正确类型的指针。只是单纯地分配指定字节数的内存空间,不会进行初始化。会先分配内存,然后调用类的构造函数来初始化对象。是 C++ 操作符,它是 C++ 语言的一部分。是 C 标准库函数,在 C++ 中也可以使用。创建空间不需要说明需要申请的字节的大小,申请空间出错,比如输入负数会返回空,在分配内存的同时会进行初始化。大小的内存,但内存中的值是未定义的。分配内存得到的指针)。: 返回的是指定类型的指针。释放时,会先调用析构函数,再调用。大小的内存,并将该内存初始化为。

2024-11-06 15:30:03 556

空空如也

空空如也

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

TA关注的人

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