自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(143)
  • 问答 (1)
  • 收藏
  • 关注

原创 Effective C++读书笔记——item52(如果编写了 placement new,就要编写 placement delete)

对应关系:编写的placement版本时,必须同时编写的相应placement版本,以避免构造函数抛出异常时的内存泄漏。避免覆盖:声明new和delete的placement版本时,要确保不会无意中覆盖这些函数的常规版本,可以通过继承包含标准形式的基类并使用using声明来解决。

2025-02-17 12:08:10 527

原创 Effective C++读书笔记——item51(编写new和delete要遵循惯例)

要点:包含无限循环尝试分配内存,失败时调用,处理零字节请求,类专用版本处理大小不符的请求。要点:收到空指针时不做处理,类专用版本处理大小不符的删除请求,基类要有虚析构函数。

2025-02-17 12:04:48 131

原创 Effective C++读书笔记——item50(什么时候替换new和delete)

替换原因多样:有很多正当理由编写new和delete的自定义版本,包括改进性能、调试堆用法错误以及收集堆用法信息。注意排列对齐:自定义时要注意排列对齐问题,确保返回的指针适合任何数据类型的排列。考虑多种因素:在决定替换new和delete时,要综合考虑性能、内存使用、错误检测等多种因素,并进行实际测试以确定是否真的有必要替换。

2025-02-17 12:00:51 404

原创 Effective C++读书笔记——item49(了解new-handle的行为)

的使用允许指定一个在内存分配请求无法满足时调用的函数,通过自定义函数可以处理内存分配失败的情况。类特定的:通过自定义和以及使用 CRTP 模板基类,可以为每个类提供类特定的。的局限性仅适用于内存分配,后续的构造函数调用可能依然会抛出异常,其作用有限。

2025-02-17 10:27:27 520

原创 Effective C++读书笔记——item48(模板元编程)

编译时优化:模板元编程能将工作从运行时转移到编译时,提前发现错误并提高运行时性能。例如,Factorial模板在编译期间完成阶乘计算,避免了运行时的计算开销。自定义代码生成:TMP 可用于基于策略选择的组合生成自定义代码,避免为特殊类型生成不适当的代码。如在矩阵操作优化和设计模式实现中,通过 TMP 技术可以根据不同需求生成合适的代码。

2025-02-17 10:24:02 241

原创 Effective C++读书笔记——item47(为类型信息写特征类)

编译期类型信息获取:traits classes 借助模板和模板特化,在编译期获取类型信息。例如,能在编译期确定迭代器的种类。编译期类型判断:结合函数重载,traits classes 可实现编译期的类型判断,避免运行时开销。如advance函数通过提供的信息,让编译器在编译期选择合适的doAdvance实现。标准库中的应用:标准库中有多种 traits classes,如等,TR1 还引入了更多的 traits classes,用于提供不同类型的信息。

2025-02-17 10:20:03 145

原创 Effective C++读书笔记——item46(需要类型转换时,在模板类定义成员函数)

在编写类模板时,如果类模板提供的函数需要支持所有参数的隐式类型转换,应将这些函数定义为类模板内部的友元函数。这样可以绕过模板实参推演的限制,确保混合模式运算能够正常进行。

2025-02-17 10:13:21 201

原创 Effective C++读书笔记——item45(用成员函数模板接受所有兼容类型)

使用成员函数模板生成接受所有兼容类型的函数,以实现智能指针类之间的类型转换和赋值操作。若为泛型化拷贝构造或泛型化赋值声明了成员模板,仍需声明常规拷贝构造函数和拷贝赋值运算符,以全面控制拷贝构造和赋值行为。

2025-02-17 10:08:52 392

原创 Effective C++读书笔记——item44(从模板中分离出参数无关的代码)

模板会产生多个类和函数,不依赖模板参数的模板代码会引起膨胀。非类型模板参数引起的膨胀可通过用函数参数或类数据成员替换模板参数消除。类型参数引起的膨胀可通过让相同二进制表示的实例化类型共享实现减少。

2025-02-17 10:04:10 210

原创 Effective C++读书笔记——item43(了解如何访问模板化基类中的名字)

在 C++ 中,当从模板化基类继承时,在派生类模板里直接访问基类模板中的名字,编译器可能不会去基类模板中查找,这是因为模板参数在编译派生类模板定义时未确定,基类模板可能存在特化版本,其接口可能与通用模板不同。

2025-02-17 09:43:19 796

原创 Effective C++读书笔记——item42(typename的两个含义)

规则的执行情况可能不同,这可能会导致一些轻微的可移植性问题。在编写模板代码时,务必遵循上述规则,以确保代码的正确性和可移植性。需要注意的是,不同编译器对。

2025-02-13 09:27:09 219

原创 Effective C++读书笔记——item41(隐式接口和编译期多态)

总之,类和模板都支持接口和多态,但类的接口是显式的,以函数识别特征为中心,多态通过虚拟函数在运行期实现;模板参数的接口是隐式的,基于合法表达式,多态通过模板实例化和函数重载解析在编译期实现。函数及其参数类型、返回类型和常量性等组成。函数返回类型不一定是整数,只要能满足后续。成员函数,支持拷贝构造函数,以及支持。直接支持,只要存在合适的隐式转型能使。类的显式接口由构造函数、析构函数、对虚拟函数的调用表现为运行期多态。但这些要求并不绝对,例如。的类型)的隐式接口要求。

2025-02-13 09:26:17 271

原创 Effective C++读书笔记——item40(谨慎使用多继承)

虚拟继承会带来成本,包括对象体积增大、访问数据成员速度变慢,以及初始化和赋值规则更复杂。建议除非必需,否则不使用虚拟基类,且若使用,尽量不在其中放置数据。总之,多继承比单继承复杂,会引发歧义、虚拟继承相关问题,但也有合理用途。使用时需谨慎,优先考虑单继承,若多继承是最佳方案,应充分了解其复杂性并合理运用。:在多继承层次结构中,可能出现 “致命的多继承菱形” 情况,即一个派生类从多个路径继承同一个基类。:多继承可以组合接口的公有继承和实现的私有继承。以利用其实现功能,并重定义。以实现接口,私有继承。

2025-02-13 09:25:10 121

原创 Effective C++读书笔记——item39(谨慎使用私有继承)

总之,私有继承意味着 “is - implemented - in - terms - of”,通常比复合低级。使用私有继承时应谨慎,需考虑所有可选方案,只有当它是表示类之间关系的最佳方法时才使用,比如在需要访问保护成员、重定义虚函数或实现空基优化等特定情况下。但 EBO 通常只在单继承下可行,且 “空” 类实际常包含 typedefs、enums、静态数据成员或非虚函数。这种设计比单纯使用私有继承更复杂,包含了公有继承和复合,还引入了新类。有概念上的 “is - a” 关系。

2025-02-12 20:26:46 451

原创 Effective C++读书笔记——item38(复合与公有继承)

总之,复合与公有继承意义不同,在应用领域体现 “has - a” 关系,在实现领域体现 “is - implemented - in - terms - of” 关系,使用时需正确区分,选择合适的方式来模拟对象间的关系。实现的,即 “is - implemented - in - terms - of” 关系。,即它们之间不是 “is - a” 关系。和标准库其他部分提供的功能来实现,这体现了。允许包含重复元素,而。

2025-02-12 20:24:32 255

原创 EffectiveC++读书笔记——item37(不要重定义通过继承得来的缺省函数值)

总之,由于缺省参数值的静态绑定和虚拟函数的动态绑定特性,在继承体系中重定义继承的缺省参数值会导致不符合预期的行为,应避免这种做法,可采用合适的替代设计如 NVI idiom。:若在基类和派生类中提供相同的缺省参数值会导致代码重复,可考虑使用非虚拟接口惯用法(NVI idiom)。:为了运行时效率,若缺省参数值动态绑定,编译器需在运行时确定其值,这比在编译期确定更慢且复杂。指定缺省参数,调用派生类可能重定义的私有虚拟函数。函数,但由于缺省参数值是静态绑定,使用的是。在这种设计中,通过基类中的公有非虚拟函数。

2025-02-12 20:20:49 156

原创 EffectiveC++读书笔记——item36(不要重定义继承的非虚拟函数)

假设存在类B和从其公有继承的类D,类B中有一个公有成员函数mfclass B {public:void mf();当使用D类型的对象x,通过指向x的B类型指针pB和D类型指针pD调用mfD x;B *pB = &x;pB->mf();D *pD = &x;pD->mf();若mf为非虚拟函数,pB->mf()调用的是B::mfpD->mf()调用的是D::mf,这是因为非虚拟函数是静态绑定的,调用的函数取决于指针的声明类型。

2025-02-12 11:01:22 230

原创 EffectiveC++读书笔记——item35(虚拟函数替代)

在设计时应考虑虚拟函数的替代方法,如 NVI 惯用法和策略模式的多种变体。NVI 惯用法是模板方法模式的实例。将机能从成员函数移到类外函数可能导致非成员函数无法访问类的非公有成员。对象类似泛型化的函数指针,支持所有与给定目标特征兼容的可调用实体。这些替代方法各有优劣,设计时应权衡考虑,避免局限于传统的面向对象设计方式。

2025-02-12 10:58:38 233

原创 EffectiveC++读书笔记——item34(接口继承和实现继承)

接口继承与实现继承不同,在公开继承下,派生类总是继承基类接口。纯虚拟函数指定仅有接口被继承;简单虚拟函数指定接口继承与默认实现继承;非虚拟函数指定接口继承与强制实现继承。类设计者应根据需求仔细选择成员函数的声明类型,避免常见设计错误。

2025-02-12 10:54:56 253

原创 EffectiveC++读书笔记——item33(避免覆盖通过继承得到的名字)

在 C++ 继承体系中,派生类名字会覆盖基类名字,在公有继承中这通常不是我们期望的。为使隐藏名字重新可见,可使用using声明或转调函数。同时,当继承与模板结合时,名字隐藏问题会以不同形式出现(详见 Item 43)。

2025-02-12 10:48:57 286

原创 EffectiveC++读书笔记——item32(is-a原则)

public inheritance 意味着 “is - a”,适用于基类的所有特性也应适用于派生类,因为每个派生类对象都是基类对象。在设计时,要确保遵循此规则,避免因违反该规则导致设计错误。同时,除了 “is - a” 关系,类之间还存在 “has - a” 和 “is - implemented - in - terms - of” 等关系,需正确理解并模拟这些关系。

2025-02-12 10:45:03 406

原创 EffectiveC++读书笔记——item31(最小化编译依赖)

最小化编译依赖的核心是用对声明的依赖替代对定义的依赖,Handle类和Interface类是基于此的有效方法。库头文件应保持完整且仅包含声明,无论是否涉及模板均适用。

2025-02-12 10:40:12 285

原创 EffectiveC++读书笔记——item30(了解inline)

策略:决定函数是否 inline 时,初始阶段应避免 inline 或仅对必要及极其简单的函数进行 inline,如这类函数。遵循 80 - 20 规则,将优化精力集中在能提升程序性能的关键 20% 代码上,使 inline 化作为手动优化手段,避免盲目 inline 导致的调试困难、代码膨胀等问题。总结:总体而言,应将大部分 inline 限制在小且调用频繁的函数上,这样既便于程序调试和二进制升级,又能最小化代码膨胀风险,最大程度提高程序运行速度。同时,不要只因函数模板在头文件中就声明为 inline。

2025-02-12 10:36:30 747

原创 EffectiveC++读书笔记——item29(争取异常安全)

编写异常安全代码时,应使用对象管理资源防止资源泄漏,为函数选择能提供的最强异常安全保证(基本、强力或不抛出),并文档化决策。若函数调用的其他函数不提供异常安全保证,自身也无法提供。虽遗留的非异常安全代码普遍存在,但编写新代码或修改现有代码时,应努力实现异常安全。

2025-02-12 10:22:46 440

原创 EffectiveC++读书笔记——item28(避免返回对象内部构件的“句柄”)

虽然在某些特殊情况下(如string和vector的operator[])需要返回句柄,但一般应避免返回对象内部构件的句柄(引用、指针或迭代器)。这样做有助于提高对象封装性,确保const成员函数真正发挥const效果,并最大程度降低空悬句柄产生的可能性。

2025-02-12 10:19:14 556

原创 EffectiveC++读书笔记——item27(减少强制类型转换)

避免随意使用强制转型,尤其是在性能敏感代码中使用,若设计需要强制转型,尝试开发无强制转型的替代方案。若必须使用强制转型,将其隐藏在函数内部,通过函数接口保护调用者。尽量用 C++ 风格的强制转型替换旧风格的强制转型,因其更易被注意且功能更明确。

2025-02-12 10:14:35 592

原创 EffectiveC++读书笔记——item26(尽量推迟变量定义)

定义带构造和析构函数的变量,在其作用域内会产生构造和析构成本。例如在// 此函数过早定义了变量“encrypted”// 执行加密操作,将加密后的password存入encrypted若password长度过短抛出异常,提前定义的encrypted对象就会产生不必要的构造和析构成本。// 此函数将encrypted的定义推迟到真正必要时// 执行加密操作,将加密后的password存入encrypted。

2025-02-12 10:10:32 183

原创 EffectiveC++读书笔记——item25(swap函数)

对类型高效,无需额外操作;若低效,按步骤提供成员。命名空间添加新东西,但可对其模板进行完全特化。时遵循特定的命名空间使用规则。(确保不抛异常)、非成员。

2025-02-12 09:29:38 159

原创 C++和Python实现可变参数

【代码】C++和Python实现可变参数。

2025-02-10 11:52:28 306

原创 Effective C++读书笔记——item24(非成员函数的用途)

函数可以使编译器自动对所有参数进行类型转换,提高代码的灵活性和一致性。当一个函数的所有参数都需要进行类型转换才能正常调用时,将该函数定义为。的成员函数,编译器不会自动对参数进行隐式类型转换,会导致编译错误。函数,编译器会对所有参数尝试隐式类型转换,使得代码可以正常运行。的对象,编译器会为它进行隐式类型转换。会导致编译错误,因为编译器不会自动对。的构造函数允许将整数转换为。类型(例如单位矩阵),那么。

2025-01-22 20:02:57 812

原创 Effective C++读书笔记——item23(用非成员,非友元函数取代成员函数)

函数可以将不同的功能分布在不同的函数中,而不是将所有功能都集中在类的成员函数里。接口来访问类,这意味着它们不能直接访问类的。因为它拥有比实际所需更多的对类内部的访问权限。函数放在一个命名空间中,形成一个功能集合。命名空间中添加即可,而不用修改。类变得臃肿,同时也不会增加。类,当需要添加新的操作。可以将清除操作的功能与。类的封装性负担,因为。

2025-01-22 19:51:45 1251

原创 Effective C++读书笔记——item22(明确变量的作用域和访问权限)

成员函数来控制对它们的访问。这样可以提高代码的健壮性、可维护性和可扩展性,同时提供了更多的设计灵活性,是一种更好的软件设计实践。为了实现良好的封装性、精确的访问控制、代码的一致性和易维护性,应该将成员变量声明为。

2025-01-22 16:38:42 321

原创 Effective C++读书笔记——item21(不要返回引用)

一个引用仅仅是一个名字,一个实际存在的对象的名字。无论何时只要你看到一个引用的声明,你应该立刻问自己它是什么东西的另一个名字,因为它必定是某物的另一个名字。正确做法是让函数返回一个新对象,虽可能有构造和析构成本,但可保证正确行为,且编译器在不改变可观察行为前提下可优化性能,消除这些成本。当函数需要返回新对象时,应返回一个新对象,将性能优化的工作交给编译器,确保程。绝不要在存在需要一个以上对象的可能性时,返回一个局部静态对象的指针或引用。这样的代码,会导致结果错误,因为始终比较的是同一个静态对象的值。

2025-01-22 14:34:23 855

原创 Effective C++读书笔记——item20(按值传递和按引用传递)

总结来说,Item 20 强调在 C++ 编程中,除非有特殊需求,否则对于大型对象和自定义类型,应优先考虑使用。的方式来传递参数,这样可以避免值传递带来的问题,提高程序的性能和可维护性,并保持对象的语义和多态性。

2025-01-21 14:12:14 245

原创 Effective C++读书笔记——item19(如何设计类)

设计 class 犹如设计 type 意味着在创建一个新的 class 时,需要全面考虑上述各个方面,以确保新类型的设计合理、功能完整、使用安全和高效,并且符合 C++ 的设计原则和习惯。这些设计决策将影响类在不同场景下的使用方式、性能表现、可维护性以及与其他代码的兼容性等。默认的复制构造函数和赋值运算符进行的是浅拷贝,对于包含指针成员的类,可能导致问题(如多个对象共享同一块内存),这时需要实现自定义的复制构造函数和赋值运算符(深拷贝)。需要注意避免隐式转换可能导致的意外情况,有时需要使用。

2025-01-21 12:05:11 408

原创 Effective C++读书笔记——item18(让接口更易使用)

【代码】Effective C++读书笔记——item18(让接口更易使用)

2025-01-21 11:55:34 769

原创 Effective C++读书笔记——item17(new 参数)

"new Widget" 表达式一定在 tr1::shared_ptr 的构造函数能被调用之前执行,因为这个表达式的结果要作为一个参数传递给 tr1::shared_ptr 的构造函数,但是 priority 的调用可以被第一个,第二个或第三个执行。第二个实际参数不过是对函数 priority 的调用,但是第一个实际参数("std::tr1::shared_ptr<Widget>(new Widget)"),由两部分组成。调用 tr1::shared_ptr 的构造函数。执行 "new Widget"。

2025-01-20 17:54:57 302

原创 git常用命令(基础篇)

【代码】git常用命令(基础篇)

2025-01-16 10:15:26 98

原创 Effective C++读书笔记——item14(小心管理类中的复制行为)

在复制资源管理类对象时,创建一个新的资源副本。将复制构造函数和赋值运算符声明为。记录有多少个对象在共享这份资源。

2025-01-14 19:08:12 294

原创 Effective C++读书笔记——item16(使用相同形式的new和delete)

假设如上图的布局,delete 将读入某些内存的内容并将其看作一个数组的大小,然后开始调用那么多析构函数,不仅全然不顾它在其上工作的内存不是数组,而且还可能忘掉了它正忙着析构的对象的类型。此外,对于类似 int 的内建类型其结果也是未定义的(而且有时是有害的),即使这样的类型没有析构函数。程序的行为是未定义的。如果你在 new 表达式中使用了 [],你必须在对应的 delete 表达式中使用 []。如果你在 new 表达式中没有使用 [],你也不必在对应的 delete 表达式中不使用 []。

2025-01-14 19:05:40 117

qt标准对话框11个使用举例

qt标准对话框11个使用举例

2024-12-16

学生信息管理系统demo

需要你对数据库的路径进行修改,之后就可以用了。

2024-07-15

udp组播demo,简单演示

其实就是对udp通信里面的ip和端口号做文章。改一下ip和端口号,改ip的时候添加一下组,就完事了。

2024-05-06

udp的demo,没什么好说的

这里是udp通讯的一个demo

2024-05-04

tcp的一个demo,里面有客户端和服务端,打开直接用就行了

没什么好说的了

2024-05-04

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

TA关注的人

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