自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 DAY 6 STL 容器

一、顺序容器(Sequence Containers)1.

2025-03-11 21:25:35 1005

原创 实习复习DAY5

std::vector通过指数扩容策略平衡内存使用与性能,适用于需要动态调整大小的场景,但需注意迭代器失效问题。新容量计算:通常按指数增长(如2倍或1.5倍),具体倍数由编译器实现决定(GCC常用2倍,MSVC可能用1.5倍)。当向vector中添加新元素(如push_back)且当前元素数量(size)已达到容量(capacity)时,触发扩容。均摊时间复杂度:单次扩容O(n),但均摊到每次操作为O(1),因扩容频率随容量指数级降低。插入第3个元素时,容量扩至4,复制前2个元素。

2025-03-09 17:59:46 323

原创 实习复习DAY4 七大排序

1.冒泡排序(Bubble Sort)原理:重复遍历数组,比较相邻的两个元素,如果顺序错误(例如前一个比后一个大),就交换它们。每一轮遍历会将当前未排序部分的最大元素“浮”到末尾。步骤:从数组的第一个元素开始,比较相邻的两个元素。如果前一个元素比后一个元素大,交换它们。重复上述步骤,直到没有需要交换的元素。时间复杂度:最好情况:O(n)(数组已经有序)最坏情况:O(n²)(数组完全逆序)平均情况:O(n²)空间复杂度:O(1)(原地排序,不需要额外空间)优点:实现简单,容易理解。

2025-03-05 15:23:17 827

原创 实习复习DAY3

通过对象的构造函数获取资源,并在对象的析构函数中释放资源,从而确保资源管理的安全性和可靠性。在 C++ 中,override 是一个关键字,用于显式地标记派生类中的虚函数,表示该函数是对基类虚函数的重写。在上面的示例中,Base 类的 show 函数被声明为 final,因此 Derived 类尝试重写 show 函数会导致编译错误。右值引用是对右值的引用,使用 && 表示。如果 lambda 表达式捕获了局部变量的引用,而该局部变量的生命周期结束后,lambda 仍然被使用,会导致未定义行为。

2025-03-03 15:01:14 858

原创 实习复习DAY2 智能指针(unique_ptr、shared_ptr、weak_ptr)

std::shared_ptr 的循环引用问题是指两个或多个 std::shared_ptr 互相引用,导致它们的引用计数无法归零,从而引发内存泄漏。此时可以使用 std::weak_ptr 解决。弱引用:std::weak_ptr 是一种不控制对象生命周期的智能指针,它指向由 std::shared_ptr 管理的对象,但不会增加引用计数。需转换为 std::shared_ptr:要访问 std::weak_ptr 指向的对象,需要先将其转换为 std::shared_ptr。

2025-03-02 18:50:20 839

原创 实习复习DAY1

虚函数是在基类中使用 virtual 关键字声明的函数,派生类可以重写(Override)这些函数。通过基类指针或引用调用虚函数时,实际调用的是派生类中重写的函数。虚继承确保在菱形继承结构中,最底层的派生类(如 D)只保留一份基类(如 A)的成员,从而消除二义性。因为C++的编译器在编译函数的时候会将函数名原本的名字加上参数类型来识别不同的重载函数,但是C语言并没有这样的功能。最底层的派生类(如 D)会直接指向虚基类(如 A)的成员,而不是通过中间类(如 B 和 C)间接访问。三大特性(封装、继承、多态)

2025-02-26 18:12:43 947

原创 计算机网络体系结构:分类、性能指标与参考模型

计算机网络是现代社会中不可或缺的基础设施,它通过不同的分类、性能指标和体系结构支持着各种网络通信需求。网络的性能直接影响到用户的体验,而网络的体系结构和参考模型则为网络的设计和实现提供了科学的框架。理解计算机网络的分类、性能指标以及体系结构,不仅有助于深入理解网络通信的基本原理,也为从事网络设计、维护和优化的工程师提供了理论指导。希望通过这篇博客,你能更清晰地认识计算机网络的基础知识及其应用,进而更好地理解和设计高效、可靠的网络系统。

2025-01-09 09:26:52 954

原创 深入理解计算机网络体系结构

在数字化浪潮席卷全球的当下,计算机网络如同一张无形却又坚韧的大网,将世界紧密相连。它已深度融入我们生活与工作的方方面面,彻底改变了我们的交流、协作与获取信息的方式。那么,究竟什么是计算机网络呢?计算机网络,从专业角度而言,是将分布在不同地理位置、具备独立功能的多台计算机及其外部设备,通过各类通信线路实现互联互通,并在网络操作系统、网络管理软件以及网络通信协议的协同管理下,达成资源共享与信息高效传递的计算机系统。通俗来讲,就是让众多计算机能够跨越空间限制,如同近在咫尺般进行信息交互与资源共享。

2025-01-08 17:19:45 807

原创 数据库的三范式是什么?

即,非主属性只能直接依赖于主键,而不能通过其他非主属性间接依赖主键。:在满足 1NF 的基础上,消除非主属性对主键的部分函数依赖。:在满足 2NF 的基础上,消除非主属性对主键的传递函数依赖。表中的非主属性必须完全依赖于主键,而不是依赖于主键的一部分。表中的每一列必须是单一属性,不能是集合、数组或嵌套结构。:在关系表中,每一列的数据值都是不可分割的原子值。消除部分依赖,避免非主属性依赖于主键的一部分。消除传递依赖,确保非主属性只依赖于主键。消除部分依赖,避免数据的重复存储。保证数据的原子性,避免数据冗余。

2024-12-22 14:16:23 423

原创 MYSQL 架构

这是 MySQL 架构的最底层部分,负责数据的存储和提取。MySQL 支持多种存储引擎,用户可以根据需求选择合适的引擎。这是 MySQL 的核心部分,主要负责 SQL 的解析、优化和执行。将连接管理、SQL 解析、优化、执行、存储引擎分离,易于扩展和维护。这一层负责管理客户端连接和权限验证,处理用户与数据库之间的交互。调整存储引擎参数(如 InnoDB 的缓冲池大小)提升性能。优化表的访问顺序、索引选择、JOIN 策略等。可以使用插件(如 SSL)增强连接的安全性。基于聚簇索引,适合高并发写入和事务场景。

2024-12-21 14:46:40 734 1

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

在对象只在特定条件下需要时,延迟到确实需要时再创建(Lazy Initialization)。如果对象的生命周期贯穿程序运行的大部分,考虑在程序启动时创建,例如单例模式中的对象。如果某类对象被频繁创建和销毁,可以考虑使用对象池来减少内存分配和释放的开销。在多线程程序中,确保对象创建和销毁的线程安全性,避免竞争条件。使用容器或专用清理类集中管理对象,统一在程序退出时清理资源。使用单例模式保证全局唯一的对象实例,但注意避免过度使用单例。管理对象的生命周期,确保对象在适当的时机被销毁。保证互斥锁的安全释放。

2024-12-20 19:52:18 612

原创 C++中如何处理对象的状态变化

通过定义多个状态对象,并让它们管理自己的状态,可以实现动态变化的状态管理。你可以通过定义成员函数来改变对象的状态。通常这些成员函数是类的“行为”,即对象状态变化的触发器。如果你希望在对象状态变化时通知其他对象,可以使用观察者模式。当对象的状态发生变化时,可以通知所有相关的观察者。如果状态相对简单,且状态的数量有限,可以使用 enum。方法来修改对象的状态,或者通过特定的方法来改变对象的内部属性。类型来表示不同的状态,并根据状态在程序中做不同的处理。:适用于复杂的状态管理,可以动态切换对象的行为。

2024-12-19 16:09:00 322

原创 C++中如何实现单例模式?

懒汉式是指在首次使用时才创建单例对象。这个方法的缺点是没有考虑线程安全性,可能在多线程环境下出现问题。保证了某段代码(这里是创建单例对象)在多线程环境下只会执行一次,避免了线程安全的问题。是为了避免不必要的加锁,第二次检查是在加锁后进行,确保只会有一个线程创建对象。为了确保在多线程环境下,懒汉式单例模式是线程安全的,可以使用互斥锁(,可以在多线程环境下以更加高效的方式实现线程安全的单例模式。进行加锁,确保在多线程环境下只有一个线程能创建单例对象。:类加载时即创建单例对象,线程安全,适用于简单对象。

2024-12-18 14:59:20 1374

原创 C++如何处理对象的生命周期管理?

通过构造函数获取资源,析构函数释放资源,确保对象生命周期与资源生命周期绑定。在 C++ 中,对象的生命周期管理至关重要,尤其是涉及动态内存分配的情况下。对于非内存资源(如文件句柄、网络连接等),可以实现 RAII 风格的资源管理器。避免直接使用裸指针,通过智能指针和 RAII 简化代码,减少内存管理错误的风险。,并避免资源泄漏或悬空指针问题。遵循 RAII 原则,将资源管理逻辑封装到类的构造函数和析构函数中。优先使用栈对象,因为它们的生命周期由作用域自动管理。),可以自动管理动态对象的生命周期,避免手动。

2024-12-17 18:14:58 559

原创 如何实现接口继承与实现继承的区别?C++

一个常见的模式是,基类提供接口(通过纯虚函数)并实现一些功能,而派生类则实现其他的功能或重写基类的某些方法。实现继承指的是派生类从基类继承功能实现,基类提供了具体的成员函数实现,派生类可以直接使用这些实现,或者重写这些实现。接口继承的目的是为派生类提供一个统一的接口约定,所有派生类必须提供这些接口函数的具体实现。:基类提供了具体的成员函数实现,派生类可以直接使用这些实现,也可以选择重写基类的成员函数。:用于复用代码,派生类继承了基类的具体实现和成员变量,能够直接使用或修改这些实现。

2024-12-15 19:25:42 985

原创 C++如何管理内存?

在 C++ 中,内存管理是一个至关重要的话题,因为 C++ 是一种静态类型语言,不提供自动垃圾回收机制(与 Java 或 Python 等语言不同)。栈内存是由操作系统自动管理的,它存储的是局部变量和函数调用的临时数据。栈内存的管理是自动的,变量在栈上分配内存时,内存会随着函数的调用而分配,当函数返回时,栈上的内存会自动释放。内存泄漏指的是程序在堆上分配内存后,没有及时释放,导致这些内存无法再被访问和释放,从而浪费内存资源。堆内存由程序员手动管理,通常用于需要动态分配内存的场景,比如对象、数组等。

2024-12-14 18:32:51 497

原创 C++ 中面向对象编程如何处理异常?

使用资源获取即初始化(RAII)管理资源,例如动态内存分配、文件句柄等,以确保即使在异常情况下资源也能正确释放。在 C++ 中,面向对象编程通过异常处理机制提供了一种结构化的方式来管理错误和异常情况。:异常处理在正常流程中没有显著开销,但捕获和抛出异常可能会增加性能损耗。:优先选择标准异常类或自定义类,而不是基本类型(如。:用于指示函数不会抛出异常,适合性能敏感的场景。如果异常没有被捕获,则会沿调用堆栈向上传播。:将可能发生异常的代码块包裹起来。块,优先匹配最具体的类型。:例如整数、字符串。

2024-12-13 15:46:52 318

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

C++ 中的多态性(Polymorphism)是一种面向对象编程的核心特性,通过它可以实现代码的灵活性和可扩展性。在需要支持动态扩展的系统中,多态性是实现插件机制的重要工具。在 GUI 应用程序或游戏开发中,事件处理常通过多态实现。在设计大型系统时,抽象基类常用于定义通用接口。在游戏开发中,不同的游戏对象(玩家、敌人、道具)可能需要动态改变行为。在开发通用框架或库时,多态性可以用于封装不同的实现。在需要支持多种平台的应用中,多态性可以封装平台相关代码。:通过多态性创建不同类型的对象。

2024-12-12 18:13:26 455

原创 C++中运算符重载

是 C++ 提供的一种功能,允许程序员为用户定义的类型(如类或结构体)重新定义或定制内置运算符的行为,使其适用于用户定义的类型。如果类型的运算规则需要修改,只需调整运算符重载函数,而不需要在代码中修改所有涉及该运算的地方。通过定义合理的运算符重载,可以实现像操作内置类型一样操作用户定义的类型。例如,派生类可以重载基类中的运算符函数以提供不同的运算逻辑。通过运算符重载,可以使用户定义的类型对象在使用运算符时表现得更直观和自然,例如将。通过运算符重载,可以让用户定义的类型使用熟悉的运算符,如。

2024-12-11 22:19:58 378

原创 C++完美转发

完美转发是C++中非常重要的技术,能够有效地提高程序的性能,避免不必要的拷贝操作,并且能在泛型编程中充分发挥作用。完美转发的实现通常涉及一个“转发函数”,其作用是接收任意类型的参数并转发给其他函数。来接收传入的参数,这样无论传入的是左值还是右值,编译器都可以根据实际情况来选择合适的值类别。不仅会将左值转换为右值引用,还会保持传入的值类别,确保如果是左值就以左值的方式转发。,也就是传入的左值应该作为左值传递,右值应该作为右值传递。是一个右值引用,实际上它是万能引用,能绑定到左值或右值。

2024-12-09 20:40:41 435

原创 纯虚函数和抽象类

通过纯虚函数和抽象类,调用时可以根据对象的实际类型动态选择合适的实现,从而实现。:抽象类不仅可以定义接口,还可以提供部分公共功能,子类可以继承和复用这些功能。:通过抽象类,开发者可以为不同的子类提供一致的接口,使得代码更加规范、统一。:纯虚函数和抽象类用于定义一个统一的接口,明确规定所有子类必须实现的功能。:抽象类可以隔离接口与具体实现,减少模块之间的耦合,从而提高系统的扩展性。:多态性消除了对对象类型的显式判断,增强了系统的开放性和灵活性。:通过抽象类,可以将接口设计与实现分离,便于代码的维护和扩展。

2024-12-08 18:04:21 643

原创 C++中的多态性

(Polymorphism)是面向对象编程的核心特性之一,意指相同的操作或方法可以对不同的数据类型或对象表现出不同的行为。: 如果通过值传递子类对象到父类类型的函数,子类部分会被切割,只保留父类部分。,调用会根据指针的静态类型决定(编译时绑定),而不是动态类型(运行时绑定)。父类引用和父类指针的行为类似,运行时会根据对象的动态类型调用相应的函数版本。当父类指针调用虚函数时,会根据对象的动态类型决定调用哪一个版本的函数。使用父类引用调用时,动态绑定依然有效,调用的是子类重写的函数版本。

2024-12-07 16:21:17 591

原创 C++中的继承性

它允许一个类(子类)从另一个类(父类)继承其数据成员和成员函数,从而实现代码的重用和扩展。通过继承,子类可以继承父类已有的功能,同时还可以扩展或重写这些功能。父类的构造函数不会被继承,但子类可以通过初始化列表显式调用父类的构造函数。通过继承,功能可以被拆分到不同的类中,每个类专注于完成某一部分任务,从而实现模块化设计。通过继承,子类可以直接使用父类已经实现的功能,避免重复编写相同代码,提高开发效率。如果需要访问父类的私有成员,可以通过父类提供的。父类的公有成员保持公有,保护成员保持保护,私有成员不可访问。

2024-12-06 18:00:01 1001

原创 C++中什么是封装性?

封装性(Encapsulation)是面向对象编程(OOP)的四大基本特性之一,它指的是将对象的状态(数据)和行为(方法)绑定在一起,并对外界隐藏对象的实现细节,只暴露必要的接口。这使得代码的维护和扩展更加容易。:通过封装,数据被限制在类的内部,不容易被外部代码随意修改,这避免了全局变量的滥用和共享,减少了代码中的潜在错误。:类的实现细节对于外部使用者是不可见的,这减少了外部与内部之间的耦合,降低了代码的复杂度。:由于外部代码与类的实现解耦,类的实现变化不会影响到使用该类的代码,减少了修改的影响范围。

2024-12-05 19:19:51 826

原创 静态链接和动态链接

由于每个静态链接的程序都包含了一份完整的库代码,多个程序使用相同库时,会重复加载相同的库代码,导致系统内存的浪费。:由于所有代码在编译时就已经链接好,所以程序启动时不需要进行动态链接的加载过程,这使得静态链接程序的启动速度较快。:因为程序本身并不包含库代码,只有库的引用信息,所以动态链接生成的可执行文件通常比静态链接的文件要小。:静态链接后的程序包含了所有必要的库文件,能够在没有安装特定库的系统上运行,因此具有较好的可移植性。:静态链接在运行时不需要进行额外的库加载,执行时的性能通常也会比动态链接略好。

2024-12-04 17:18:17 1440

原创 什么是隐式类型转换?

隐式类型转换有时会引入不必要的性能开销。它可以在几乎任何类型之间进行转换,但这种转换的结果通常是未定义的,特别是在转换为指针或引用时。虽然显式类型转换可以在某些情况下明确意图,但如果过度使用,尤其是在类型不匹配的情况下,可能会让后续开发者不易理解代码的实际含义,增加维护成本。对于指针类型的强制转换,可能会遇到内存对齐问题,尤其是在不同的数据类型之间进行指针转换时,可能会导致程序运行时访问无效的内存地址或内存损坏。如果需要转换类型,最好显式地进行类型转换,这样可以明确你的意图,避免隐式转换可能带来的问题。

2024-12-02 20:31:56 2506

原创 函数重载C++

例如,对于函数调用add(3L, 4L)(其中L表示长整型常量),如果存在int add(int a, int b)函数,编译器可能会考虑将long类型转换为int类型来匹配这个函数,但同样,如果有更合适的重载函数(如long add(long a, long b)),会优先选择后者。例如,如果有一个类MyClass,并且定义了从MyClass到int的转换函数,那么在调用add函数(假设add函数有一个int类型的参数)时,如果传入MyClass类型的对象,编译器会尝试使用这个自定义转换函数来进行匹配。

2024-12-01 16:28:56 559

原创 C++内存对齐

在 C++ 中,内存对齐 是一种编译器和硬件协作的机制,用于将数据存储在内存中时按照一定的规则进行排列,以提高数据访问的效率。大多数 CPU 是按照固定宽度的内存总线来访问内存的(比如 4 字节或 8 字节),而非逐字节操作。对齐单位(Alignment Unit): 每种数据类型有其对应的对齐单位,通常是数据类型的大小。不同平台可能对数据对齐的要求不同。整个结构体的大小是最大对齐单位的整数倍(即结构体的大小会被填充到满足最大成员对齐单位的倍数)。遵循硬件架构对对齐的要求,避免未对齐访问导致的性能问题。

2024-11-30 18:50:45 636

原创 右值引用和移动语义

完美转发是通过右值引用和 std::forward 实现的技术,允许你将函数参数完美地传递给另一个函数,保持其原始类型(左值或右值)。右值引用和移动语义是 C++11 引入的关键概念,用于优化资源管理和提高性能,尤其是在涉及大量数据复制和传输的情况下。右值引用是 C++11 引入的一种新的引用类型,它允许你绑定到右值,而不仅仅是左值。左值:可以在表达式的左边,表示的是一个持久的对象,地址可以取出(例如变量)。右值:不能在表达式的左边,表示一个临时的值,通常是一个即将被销毁的对象或常量。

2024-11-29 17:17:51 549

原创 volatile 关键字

在 C/C++ 中,volatile 关键字的作用是告诉编译器,该变量可能会在程序的其他地方被意外地修改,或者它的值可能在程序外部(如硬件寄存器或并发程序的其他线程)发生变化。因此,编译器在访问这些变量时不能进行优化,必须每次都直接从内存中读取该变量的值。具体来说,volatile 关键字的作用包括:防止编译器优化通常情况下,编译器会根据代码的执行路径进行优化,例如将变量的值缓存到寄存器中。但如果变量是 volatile 的,编译器就不会做这种优化,它每次都会从内存中重新读取变量的值。

2024-11-28 18:46:46 348

原创 C++ 中的函数对象

在 C++ 中,函数对象(Function Object),也叫作 仿函数(Functor),是指任何可以像函数一样调用的对象。具体来说,函数对象是重载了 operator() 的类的实例,这样该对象就可以通过类似调用函数的方式来使用。特点:通过重载operator()函数对象的核心特征是它实现了 operator()。这样,类的实例就可以像普通函数那样被调用。状态可以被保存:函数对象与普通函数不同的是,它们可以拥有成员变量,因此可以在调用过程中保存和维护状态。

2024-11-27 19:36:03 2676

原创 C++ 中的多继承

菱形继承问题(Diamond Problem):如果两个父类有共同的祖先类,子类会继承父类的多个副本,可能导致重复或冲突。例如,A 继承了 B 和 C,B 和 C 都继承了 A,如果 A 中有相同的方法或成员变量,那么 Derived 类就会有多个 A 的副本。在虚继承中,基类的多个实例不会被重复继承,而是通过一个共享的实例来实现,从而避免冗余和冲突。通过虚拟继承,只有一个父类实例被继承,避免了多次继承同一父类的副本。在普通的多继承中,当多个父类共享一个共同的基类时,子类可能会继承该基类的多个副本。

2024-11-26 22:13:48 696

原创 Lambda 表达式

Lambda 表达式可以直接访问这些变量,而不需要显式捕获(它们不依赖捕获列表)。捕获当前对象的指针,使 Lambda 可以访问类的成员变量和成员函数。捕获局部变量的副本,Lambda 内部修改捕获变量不会影响外部变量。:直接访问变量的引用,Lambda 内修改会影响外部变量。:Lambda 表达式可以捕获作用域中的局部变量。:Lambda 表达式的主体,包含要执行的代码。:指定可以被 Lambda 表达式捕获的变量。:函数的参数列表,与普通函数的参数形式类似。:可以通过捕获列表捕获额外的局部变量。

2024-11-25 16:02:08 440

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

不仅可以为普通类型定义别名,还可以为模板类型定义别名。语法更加直观,将别名的定义与类型关联起来。三、typedef 和 using 的区别。定义嵌套类型别名,提高代码可读性。函数指针的定义比较复杂,使用。示例 1:为函数指针定义别名。提供了更简洁的语法,优于。声明(C++11 引入)是新定义的类型别名。(1)支持模板类型别名。示例 2:模板类型别名。2. 使用场景和优点。简化复杂类型的书写。不能定义模板类型别名。(2)简化复杂的类型。

2024-11-24 14:28:54 518

原创 模板特化和偏特化

模板特化是为一个特定类型或组合的类型提供模板的专门实现。通过模板特化,可以覆盖模板的通用实现,以便对某些特定类型进行特殊处理。模板偏特化是对部分模板参数进行特化,而非所有参数都指定具体类型。它允许根据某些参数的特性对模板进行特化,同时仍然保持通用性。模板偏特化是为某些特定模式或参数组合提供实现。:通过部分参数特化,实现适用于特定情况的模板。模板特化是为一个模板的特定类型提供专门实现。只能为特定的类型提供实现,不支持部分特化。通用模板仍然适用于其他未特化的类型。:定义适用于大多数类型的通用模板。

2024-11-23 16:28:48 653

原创 移动语义和拷贝语义

如果对象拥有动态分配的资源(例如内存、文件句柄等),拷贝操作会分配新的资源,并复制内容到新分配的资源中。移动语义不会复制资源,而是直接将资源的所有权从一个对象转移到另一个对象,减少分配和复制操作的开销。被移动的对象会进入一种“空”或“无效”状态(其资源已被转移),但对象本身依然存在。拷贝操作可能涉及资源的重新分配和逐元素复制,性能开销大。适用于需要复制资源的情况,例如多次使用相同的资源。拷贝语义是传统的 C++ 对象语义,通过。每个对象有独立的资源,彼此互不影响。实现资源管理,避免不必要的资源复制。

2024-11-23 10:21:26 307

原创 C++中的移动语义

(Move Semantics),允许资源(如动态分配的内存、文件句柄等)从一个对象转移到另一个对象,而不需要进行不必要的深拷贝。是 C++11 引入的一个函数模板,它并不会实际地移动数据,而是将一个左值转换成右值引用,从而允许我们触发移动语义。这些函数允许将对象的资源(如动态分配的内存、文件描述符等)从一个对象“转移”到另一个对象,而不是进行复制。:是指具有持久生命周期的对象,通常是具有名称的对象,可以取其地址。移动构造函数的目的是将一个临时对象的资源转移到另一个对象中,而不是复制它们。

2024-11-21 22:06:10 780

原创 C++ 中的初始化列表

例如,当成员变量是一个类对象时,直接通过初始化列表调用其构造函数初始化,而不需要先调用默认构造函数再赋值。如果在构造函数体内赋值,成员变量会先被默认初始化(调用默认构造函数)或被编译器隐式初始化(例如基本类型会被未定义值初始化)。初始化列表 和 在构造函数体内赋值 的主要区别在于成员变量的初始化时机和方式,它们对性能、功能和可用性都有不同的影响。在初始化列表中,成员变量在对象创建时被直接初始化。如果类中包含其他类类型的成员对象,并且该对象没有默认构造函数,则必须通过初始化列表来初始化它们。

2024-11-20 14:32:30 963

原创 C++ 中的友元函数和友元类

友元是 C++ 中一种灵活的访问权限控制机制,能够增强类的协作能力,简化类设计。友元函数或类能够访问类的私有和保护成员,这违背了封装的基本原则。当多个类需要共享彼此的私有数据时,使用友元类可以让某个类直接访问另一个类的私有成员,避免通过公共接口间接访问。友元功能提供了访问权限,但不代表应该随意使用,过度的友元使用可能会造成代码耦合性过高,降低代码的模块化程度。关键字显式声明友元关系。被声明为友元的类可以访问另一个类的所有成员,包括私有和保护成员。友元函数不是类的成员函数,但可以访问类的私有和保护成员。

2024-11-18 16:18:21 524

原创 C++ 内联函数

与普通函数调用不同,内联函数会在编译阶段将函数的代码直接嵌入到调用处,而不是通过函数调用机制。而内联函数将代码直接嵌入调用处,避免了这些额外步骤,从而提高执行效率。内联会增加代码的体积(特别是函数被多次调用时),可能导致可执行文件变大,甚至对性能造成负面影响。通过内联函数,开发者可以将常用的逻辑封装为函数,同时保持代码的高效运行和可读性。减少函数调用的时间消耗,适合那些频繁调用、代码量较小的函数,例如数学计算函数。:那些在程序中多次调用的函数,使用内联可以显著提高效率。:代码量小的函数更适合作为内联函数。

2024-11-17 14:57:33 405

空空如也

空空如也

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

TA关注的人

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