- 博客(243)
- 资源 (16)
- 收藏
- 关注
原创 【和春笋一起学C++】(五十一)复制构造函数
本文介绍了C++中复制构造函数的基本概念和使用场景。复制构造函数用于初始化新对象时复制现有对象,当类中没有显式定义时,编译器会自动生成隐式复制构造函数。文章重点阐述了三种必须显式定义复制构造函数的情况:当类包含new初始化的指针成员时,必须进行深度复制以避免浅复制问题;当函数按值传递或返回对象时会自动调用复制构造函数;默认复制构造函数会逐个复制数据值,但静态成员不受影响。文中通过MyClassString类的示例,说明了深度复制与浅复制的区别,强调了指针成员类必须显式定义复制构造函数的重要性。
2025-12-14 20:37:04
374
原创 【和春笋一起学C++】(五十)在构造函数中使用new时的注意事项
摘要:C++中使用new和delete管理指针成员时需遵循配对原则:new对应delete,new[]对应delete[]。构造函数中指针初始化方式必须统一(带或不带[]),以兼容单一析构函数。允许将指针初始化为NULL/0,因delete可作用于空指针。NULL与0等效,但C++更倾向使用0。深度复制场景(如复制构造函数和赋值运算符)需分配新空间并复制数据,而非仅复制地址。
2025-12-13 22:35:06
188
原创 【和春笋一起学C++】(四十九)C++中string类的简介
本文介绍了C++中实现类似cstring库功能的string类设计方法。通过自定义MyClassString类,实现了字符串的基本操作:1)默认构造函数处理空字符串;2)重载比较运算符(<,>,==)使用strcmp函数实现字符串比较;3)重载赋值运算符直接处理C风格字符串;4)重载[]运算符实现字符访问和修改。类设计中采用动态内存管理,通过new/delete处理字符串存储,并支持C字符串与自定义类的转换。这些方法为C++字符串操作提供了面向对象的实现方案。
2025-12-03 22:12:07
583
原创 【和春笋一起学C++】(四十八)在类中声明静态数据成员
摘要:本文探讨了C++中类的静态数据成员特性,包括声明、初始化和使用方法。静态数据成员在类声明中声明,通常在实现文件中初始化,所有对象共享同一静态成员。文章通过在Cvector类中添加静态成员num_steps来统计创建的对象数量,演示了静态成员的使用。实例显示,通过对象访问静态成员时,所有对象共享同一变量,能够准确记录对象创建次数。特别强调了头文件中不能初始化静态成员以避免重复定义错误,以及静态成员独立于对象存储的特性。运行结果验证了静态成员的正确使用方式。
2025-11-02 22:42:58
396
原创 【和春笋一起学C++】(四十七)C++程序中的bootstrap函数
程序启动时,除了main函数外,往往需要在程序运行前进行初始化操作。这可以通过bootstrap函数实现,分为隐式启动(编译器自动处理)和自定义引导。C++中利用全局对象在main前初始化的特性,可以实现配置文件加载和日志系统初始化等功能。例如定义全局ConfigInfo对象自动读取配置,或创建Logger全局对象初始化日志系统。这些操作都在main函数执行前完成,确保程序正确运行环境。
2025-10-29 15:32:04
217
原创 【和春笋一起学C++】(四十六)类的自动类型转换和强制类型转换
本文介绍了C++中的类型转换机制,包括内置类型的自动/强制转换和类的类型转换。对于内置类型,编译器会自动进行兼容类型的转换,不兼容类型需使用强制转换。对于类类型,接受单一参数的构造函数可实现隐式转换,但使用explicit关键字可限制只能显式转换。文章还详细说明了类的隐式转换的多种形式,包括初始化、赋值、传参和返回值等情况,并指出当存在多个可能的转换路径时可能产生二义性问题。
2025-10-28 11:19:05
770
原创 【和春笋一起学C++】(四十五)多线程编程中的线程安全问题
本文探讨了C++多线程编程中的线程安全问题及解决方案。重点分析了rand()函数的非线程安全特性及其导致的静态变量竞争问题,建议使用<random>库替代。通过随机行走理论程序的单线程(232ms)与多线程(137ms)实现对比,展示了多线程约41%的性能提升。文中详细介绍了使用mutex和lock_guard保护共享变量(vector_steps和outf)以避免数据竞争的方法,说明了lock_guard自动加锁/解锁的RAII机制在简化线程同步中的重要作用。
2025-09-23 20:55:54
355
原创 【和春笋一起学C++】(四十四)随机行走理论——编程实现
文章摘要:本文探讨了随机行走理论在程序设计中的实现方法。首先介绍使用传统C++随机函数rand()和srand()生成伪随机数的局限性,并给出了矢量类Cvector的实现方案。然后重点分析了C++11标准中更先进的随机数生成方法,包括梅森旋转算法引擎std::mt19937和各种分布类。通过对比两种实现方式,展示了如何利用<random>头文件生成更安全、更可靠的随机数序列,最终应用于随机行走模拟程序中。文章提供了完整的代码示例,包括类定义和使用方法。
2025-09-23 09:24:26
802
原创 随机行走理论——哲学与自然科学之间的关联
摘要:本文通过"醉鬼走路"的数学问题,探讨了随机行走与人生迷茫的相似性。通过建立数学模型(固定步长、随机方向)和计算机模拟(1000次试验),验证了步数与距离的关系。研究发现,尽管步数波动较大(如步长1英尺时345~10882步),但平均步长与理论值接近。作者由此引申出人生哲理:迷茫时应保持自信,大胆前行。虽然方向可能随机,但只要不停步,终能实现目标。文章还提供了相关C++编程实现的参考。
2025-09-17 16:30:04
294
原创 【和春笋一起学C++】(四十三)友元函数的常见用途——重载输出操作符
本文介绍了如何通过友元函数重载<<操作符来输出自定义类Ctime的对象数据。传统方法需调用show_time()成员函数,而重载后可直接使用cout<<t1形式。关键点在于将重载函数定义为友元函数并返回ostream引用,以支持链式调用如cout<<t1<<t2。文章还展示了如何将对象数据写入文件,并解释了操作符从左到右的结合特性及ostream引用的继承特性。通过这种重载方式,实现了与内置类型一致的对象输出功能。
2025-09-16 11:14:03
367
原创 【和春笋一起学C++】(四十二)友元函数
本文介绍了C++中的友元函数及其应用。通过重载乘法运算符的示例,说明成员函数重载与非成员函数重载的区别:成员函数要求左操作数为对象,而非成员函数则更灵活。为解决非成员函数访问私有成员的问题,可以使用友元函数,即在类声明中以friend关键字声明函数,使其获得访问私有成员的权限。文中详细演示了如何将operator*()声明为友元函数,并比较了友元函数与普通非成员函数的区别,强调友元函数必须通过对象访问私有成员。该机制有效扩展了运算符重载的灵活性。
2025-09-10 07:42:09
322
原创 【和春笋一起学C++】(四十一)操作符重载
本文介绍了C++操作符重载的概念与实现方法。操作符重载通过operatorop()函数实现,允许扩展操作符到用户定义类型。以Ctime类为例,演示了如何将sumTime()成员函数重载为operator+(),使两个时间对象能用+相加。文章还说明了重载操作符的调用方式(函数表示法或操作符表示法),并验证了多对象相加的有效性。此外,展示了如何重载*操作符实现时间对象与数值相乘。操作符重载增强了代码可读性,使对象操作更直观。
2025-09-08 16:18:47
300
原创 【和春笋一起学C++】(四十)抽象数据类型
摘要:本文介绍了使用C++类实现堆栈抽象数据类型(ADT)的方法。通过定义stack类,使用私有数组存储数据,MAX枚举设置容量,top索引跟踪栈顶位置。公有成员函数包括构造器、isempty()/isfull()判断、push()/pop()操作。push()在栈未满时添加数据并递增top,pop()在栈非空时返回栈顶数据并递减top。typedef定义Item类型便于修改元素类型,体现了ADT的通用性特点。整个实现将堆栈操作封装为类接口,隐藏内部数据存储细节。
2025-09-05 16:47:17
252
原创 【和春笋一起学C++】(三十八)this指针、对象数组以及类的接口变更
本文介绍了C++中this指针和对象数组的使用方法。this指针指向调用它的对象,通过this->可以显式访问类成员和方法。对象数组的初始化需要使用构造函数,可以通过不同构造函数初始化不同元素,但必须包含默认构造函数。文章还区分了接口变更(修改公有部分)和实现变更(修改私有部分),指出类设计应尽量使自定义类型与内置类型使用方式一致。文中以Student类为例,展示了show_score()和get_average_score()方法中使用this指针的两种写法,以及对象数组初始化的多种方式。
2025-09-03 16:19:11
662
原创 【和春笋一起学C++】(三十九)类作用域
摘要:C++中的类作用域使得类内定义的名称仅在该类中可见,不同类的同名成员不会冲突。要调用类成员必须通过对象,定义成员函数时需使用作用域解析操作符。创建类共享常量有两种方式:1)在类中声明枚举(如enum{max_score=100}),编译器会直接替换符号;2)使用static const声明静态常量(如static const int max_score=100),该常量存储在静态区被所有对象共享。常规常量声明方式不适用于类作用域常量。
2025-09-03 15:59:52
471
原创 【和春笋一起学C++】(三十七)类的析构函数
【摘要】本文介绍了C++中析构函数的作用与使用场景。析构函数在对象生命周期结束时自动调用,用于完成清理工作,如释放构造函数中动态分配的内存。其命名规则为类名前加"~",无返回值和参数。文中以Student类为例,展示了当类成员包含动态分配的指针时,必须自定义析构函数使用delete释放内存,避免内存泄漏。实例代码演示了如何在析构函数中正确释放构造函数中分配的数组内存空间。
2025-08-27 22:10:23
467
原创 【和春笋一起学C++】(三十六)类的构造函数
本文介绍了C++中构造函数的概念与使用。构造函数是类的特殊成员函数,用于初始化对象的数据成员,其名称与类名相同且无返回值。文章详细讲解了构造函数的声明方式、重载特性以及两种调用方式(显式和隐式)。特别强调了默认构造函数的重要性:当类未提供任何构造函数时编译器会自动生成一个不做任何操作的默认构造函数;若已定义非默认构造函数,则必须显式提供默认构造函数,否则可能导致对象创建错误。文中以Student类为例,展示了如何合理设计构造函数来确保数据成员的正确初始化。
2025-08-27 11:17:51
1074
原创 【和春笋一起学C++】(三十五)类的使用实例
本文通过一个学生成绩管理类的实例,展示了C++类的使用方法。类与内置类型使用方式类似,可通过声明变量、new动态分配、作为函数参数等方式使用。文章以Student类为例,演示了构造函数初始化成绩、成员函数设置/获取成绩、对象间赋值等操作。在类设计中强调"客户/服务器"模型:使用者只需了解公有接口,设计者负责实现细节。特别说明了指针操作(new/delete)、对象赋值、引用传参等关键技术点,体现了面向对象编程的封装性和易用性特点。
2025-08-24 16:11:54
673
原创 【和春笋一起学C++】(三十四)类的设计
本文介绍了面向对象编程(OOP)在C++中的实现方式,重点讲解了类的概念和使用方法。文章首先阐述了类型的基本概念,包括内置类型和用户自定义类型的作用。然后详细说明了类的定义、接口和声明,通过Student类的示例展示了如何设计类成员和数据封装。文章还解释了类成员函数的定义方法,包括作用域解析操作符的使用和内联函数的特性。最后总结了类设计的基本步骤:提供类声明(包含数据成员和函数成员的私有与公有部分)和实现类成员函数。通过类,C++实现了抽象、数据隐藏和封装等OOP特性。
2025-08-20 09:55:55
606
原创 【git使用】将一个仓库的分支代码推送到另一个仓库的分支上
本文介绍了如何将Git老项目分支代码推送到新项目分支的操作步骤:1)切换到老项目的aaa分支;2)添加新仓库远程地址origin_new;3)强制推送老项目aaa分支到新项目bbb分支(git push -f origin_new aaa:bbb);4)删除临时添加的远程地址origin_new。该流程适用于基于已有项目代码进行新功能开发时迁移特定分支代码的场景。
2025-08-12 14:30:53
674
原创 【和春笋一起学C++】(三十三)名称空间的其他特性
本文介绍了C++中嵌套名称空间和未命名名称空间的使用。对于嵌套名称空间,展示了如何通过using namespace electronicEquipment::computer访问内部成员,并说明using指令具有传递性(如electronicEquipment包含book时自动包含其成员)。未命名名称空间的特点是其成员作用域限于声明区域,不能在其他文件中使用,可作为静态内部变量的替代方案。文章通过示例代码演示了这些特性,并指出最新C++标准不推荐在名称空间和全局作用域使用static关键字。
2025-08-09 17:43:34
451
原创 【和春笋一起学C++】(三十二)名称空间
本文介绍了C++名称空间的定义、特点和使用方法。名称空间通过namespace关键字创建,能够避免不同名称空间中的同名标识符冲突。访问名称空间可通过作用域解析符"::",或使用using声明和using编译指令。using声明将特定名称引入当前作用域,而using编译指令使整个名称空间可用。文章比较了二者的区别:using声明可能导致重定义错误,而using编译指令允许局部名称覆盖名称空间名称。最后给出了使用建议:优先使用作用域解析符或using声明,避免在头文件中使用using编译指令
2025-08-07 22:51:06
789
原创 【和春笋一起学C++】(三十一)动态内存
由new分配的400个字节(假设float占4个字节)的内存将一直保留在内存中,直到使用delete将其释放或程序结束。但fp指针在包含该指针的函数结束后就被释放掉了,如果想要使用这400个字节中的内容,则必须将pf的地址通过参数或返回值传递出来。使用new操作符分配的内存称为动态内存,动态内存由操作符new和delete控制,不受作用域和链接性的规则控制,动态内存可以在一个函数中分配,在另一个函数中释放。C++编译器通常使用3块独立的内存,一块用于静态变量,一块用于自动变量,一块用于动态变量。
2025-08-06 16:53:49
233
原创 【和春笋一起学C++】(三十)函数链接性
本文介绍了C++中函数的链接性问题。默认情况下函数具有外部链接性,可在各文件间共享;使用static关键字可将其设为内部链接性,仅限当前文件使用。文章通过三文件示例(demo.cpp/test.h/test.cpp)展示了静态函数如何避免重定义问题,并说明编译器查找函数定义的顺序:先当前文件,再其他程序文件,最后库文件。同时指出C++"单定义规则"对外部链接函数的限制,以及内联函数定义可置于头文件的特性。
2025-07-30 15:01:46
439
原创 【和春笋一起学C++】(二十九)存储说明符和限定符
本文介绍了C++中的存储说明符和cv限定符。存储说明符包括auto(自动变量)、register(建议寄存器存储)、static(静态存储或内部链接性)、extern(引用声明)和mutable(允许修改const结构成员)。cv限定符包含const(禁止修改)和volatile(防止优化)。重点说明const限定符在不同作用域的表现:作用于全局变量时使其具有内部链接性,允许多文件包含同名常量;作用于局部变量时仅在该代码块内有效。文章通过代码示例展示了mutable关键字如何突破const限制修改结构成员。
2025-07-25 14:58:07
818
原创 【和春笋一起学C++】(二十八)静态存储持续性
本文介绍了C++中三种静态存储持续性变量的特性:1. 外部链接性变量(全局变量),可在多文件程序中共享使用;2. 内部链接性变量(static修饰),仅限当前文件使用;3. 无链接性变量(函数内static修饰),仅限定义代码块使用。三种静态变量都具有程序生命周期,未初始化时默认为0,且只能使用常量表达式初始化。文章通过多个示例展示了不同链接性变量的作用域、初始化特点及使用方法,包括extern声明、同名变量隐藏规则和作用域解析操作符的应用。特别说明了静态局部变量只初始化一次的特性,与自动变量的区别。
2025-07-24 16:20:43
914
原创 【和春笋一起学C++】(二十七)自动存储持续性
本文系统介绍了C++中的存储持续性、作用域及链接性概念。重点阐述了自动存储持续性的特性,包括自动变量的初始化、堆栈管理机制以及寄存器变量的使用。文章详细说明了三种存储持续性(自动、静态、动态)的区别,解析了变量作用域的范围规则,并通过代码示例展示了自动变量在函数中的行为特点。特别指出编译器使用堆栈管理自动变量时的后进先出机制,以及寄存器变量通过register关键字优化访问速度的特性。全文为理解C++变量存储机制提供了清晰的技术框架。
2025-07-20 08:55:44
924
原创 【和春笋一起学C++】(二十六)程序设计与编译
摘要:本文介绍了程序设计的一般准则,重点讲解了多文件程序的组织方法。程序通常分为头文件(包含声明)和源代码文件(包含定义和调用)。文章通过直角坐标与极坐标转换的实例,展示了头文件防护机制(#ifndef)的使用方法,并说明了不同编译器生成的对象文件无法直接链接的原因。同时强调了头文件应包含结构声明而非函数定义,以及源代码文件中系统头文件与自定义头文件的包含方式差异(尖括号与双引号)。最后指出不同编译器产生的二进制模块因名称修饰规则不同而不能兼容链接的问题。
2025-07-15 17:23:08
1024
原创 【和春笋一起学C++】(二十四)C++函数新特性——显式具体化模板函数
摘要:本文介绍了C++中的显式具体化模板函数,通过student结构体示例说明当需要定制化交换特定成员时,显式具体化比普通模板更适用。文章展示了具体化模板的声明方式(template<> void Swap<student>),并比较了其与普通模板函数的优先级关系:非模板函数>显式具体化>常规模板。实例代码验证了显式具体化仅交换studentID而保留其他成员的特性,体现了C++模板特化的灵活应用。
2025-07-06 17:56:06
898
原创 【和春笋一起学C++】(二十三)C++函数新特性——函数模板与模板重载
函数模板是C++中的通用编程工具,允许使用参数化类型定义函数。通过template<typename Any>声明模板,编译器会根据调用时的具体类型自动生成对应版本的函数。例如Swap模板函数能处理int、double等多种类型的数据交换,无需重复编写相似代码。实例演示了模板如何为不同类型生成专用函数,最终程序仅包含实际调用的函数版本,既提高了代码复用性又保证了运行效率。
2025-06-29 10:07:38
615
原创 【和春笋一起学C++】(二十二)C++函数新特性——函数重载
函数重载允许在C++中定义多个同名函数,前提是它们的参数列表(特征标)不同。特征标包括参数类型、数目和顺序,而变量名和返回值类型不影响重载。使用时需确保参数类型匹配,避免因类型转换引起歧义。特殊情况包括:1)类型引用与原始类型被视为相同特征标;2)返回值类型不参与特征标判断。正确运用函数重载能实现功能相似但参数不同的函数调用,但需注意避免编译器无法分辨的情况。
2025-06-24 22:51:35
540
原创 【和春笋一起学C++】(二十一)C++函数新特性——默认参数
C++默认参数详解:函数调用时可省略参数,自动使用预设值。默认参数需在函数原型中从右向左设置,如char* left(const char* str, int n=1)。示例程序展示了如何利用默认参数获取字符串前n个字符,同时优化内存分配,避免浪费空间。关键点:默认参数简化代码,减少重载函数数量;字符串处理需注意结尾空字符;合理计算内存需求可提高效率。文章还纠正了默认参数设置的常见错误,并提供了改进的内存优化方案。
2025-06-22 16:42:11
507
原创 【和春笋一起学C++】(二十)关于引用作为函数参数的总结
C++函数参数传递方式的选择取决于数据对象类型和修改需求:对于内置类型和小型结构建议按值传递;数组必须用指针;大型结构和类对象推荐使用const引用以提高效率;需要修改数据时,内置类型用指针,结构用指针或引用,类对象用引用。文章还强调了独立思考和分析能力的重要性,建议通过量化方式理性处理情感问题。
2025-06-17 23:22:06
284
原创 【和春笋一起学C++】(十九)C++函数新特性——对象的引用作为函数参数
摘要:本文探讨了C++中将对象引用作为函数参数的使用方法。通过四个string拼接函数的对比实验,展示了不同参数和返回值类型的设计差异:version1使用const引用参数并返回对象值;version2返回非const引用导致输入被修改;version3因返回局部对象引用而崩溃;version4使用值传递效率较低但正确。重点分析了函数返回机制中临时存储区与直接引用的区别,解释了version3崩溃的原因,并说明了编译器对char*到string的隐式转换机制。实验结果验证了正确使用对象引用的重要性。
2025-06-14 13:24:24
818
原创 【和春笋一起学C++】(十八)C++函数新特性——引用变量用作函数参数
上面的程序中,当调用程序访问返回值时,返回值total的变量生命周期已经结束,该变量的内存空间已被释放,因此,调用程序访问了一个未知的地址,所以输出值才出现了一串乱的数字。这时当sum函数结束时,只要没有使用delete释放存储homework_time结构数据的内存空间,那么存放在内存空间的返回值就不会丢失,调用程序也就能访问到函数的返回值。需要注意的地方是,不能将函数中的自动变量作为函数的返回值,即当函数结束时,如果变量所占的内存单元被释放了,那该变量就不能作为返回值。求和结果是一串乱码,怎么回事呢?
2025-06-08 12:53:51
739
原创 【和春笋一起学C++】(十七)C++函数新特性——内联函数和引用变量
C++的函数特性相比C语言有显著改进,本文重点介绍了内联函数和引用变量两种特性。内联函数通过在编译时展开代码来提高运行效率,适用于频繁调用且代码简短的函数。引用变量则是变量的别名,与原始变量共享内存地址,主要用于函数参数传递。文章通过代码示例展示了二者的基本用法,并比较了引用与指针的区别。这些特性使C++在代码效率和编程便利性上优于C语言。
2025-06-04 22:11:01
814
原创 【和春笋一起学C++】(十六)结构作为函数参数
本文介绍了C++中结构作为函数参数的三种传递方式:直接传递结构、传递结构地址和传递结构引用。直接传递适合数据量小的结构,但会复制数据;传递地址通过指针访问数据,减少内存开销;传递引用语法简洁且安全,推荐使用。通过homework_time结构示例,展示了每种方式的代码实现和适用场景,其中传递引用方式既高效又避免了指针操作。建议根据结构大小和修改需求选择合适的方式,大数据量时优先考虑地址或引用传递以提高性能。
2025-05-26 21:37:09
428
原创 【和春笋一起学C++】(十五)字符串作为函数参数
开始,str指向字符串的第一个字符,因此*str表示的是第一个字符。最终str*将指向字符串结尾的空值字符,使得*str等于0(空值字符的数字编码为0),从而结束循环。需要注意的是,字符串与普通char数组的区别,字符串有内置的结束字符(空置字符,‘\0’),普通的char数组包含字符,但不是以空值字符结尾的,所以它不是字符串。例如:可以将一个结构赋给另一个结构,也可以将一个对象赋给另一个对象。可以将结构作为一个完整的实体传递给函数,也可以将一个对象作为完整的实体传给函数。
2025-05-23 18:58:00
676
原创 【和春笋一起学C++】(十四)指针与const
在C++中,const关键字用于指针时有两种主要情况:const int* pt和int* const pt。第一种情况,const int* pt,表示指针pt指向一个整型常量,不能通过pt修改该常量的值,但pt本身可以指向不同的地址。第二种情况,int* const pt,表示指针pt本身是常量,不能指向其他变量,但可以通过pt修改所指向变量的值。此外,将常量地址赋给非常量指针是非法的,因为这可能导致通过指针修改常量的值,违反了常量的定义。在实际编程中,使用const可以避免无意修改数据,并增加代码的灵
2025-05-17 18:52:37
550
解决pjreddie版darknet在cudnn8.x环境下的编译问题
2022-05-18
VS2017环境下的tinyXML库
2022-05-09
opencv4.2,包括了扩展库opencv_contrib
2022-04-12
setuptools-36.2.4.zip
2020-02-27
GDAL111版本,包含proj.dll库,能实现坐标系统的转换功能
2018-05-04
opencv3.4.7build.zip
2020-01-03
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅
14