- 博客(110)
- 收藏
- 关注
原创 C++_核心编程_多态案例二-制作饮品
摘要:本文通过C++多态技术实现饮品制作流程。定义抽象基类AbstractDrinking,包含煮水(boilWater)、冲泡(brewMethods)、倒杯(pourCup)和加料(pourSeasonings)四个纯虚函数,以及规定流程的makeDrinking方法。派生类MakeCaffe和MakeTea分别实现咖啡和茶的具体制作步骤。测试函数DoWork通过基类指针调用不同饮品的制作方法,展示多态特性。程序输出显示咖啡制作需加糖和牛奶,而茶则加柠檬,体现了不同饮品制作过程的差异。
2025-06-10 15:30:38
305
原创 C++_核心编程_纯虚函数和抽象类
本文介绍了C++中纯虚函数和抽象类的概念。通过代码示例说明,当父类中的虚函数没有实际意义时,可以将其声明为纯虚函数(使用=0语法)。包含纯虚函数的类称为抽象类,其特点是无法实例化对象,且子类必须重写纯虚函数,否则该子类也会成为抽象类。示例展示了抽象类Base及其子类Son的实现,以及如何通过基类指针调用子类重写的虚函数方法。
2025-06-10 14:39:33
92
原创 C++_核心编程_多态案例一-计算器类
本文展示了利用多态技术实现计算器类的案例。通过定义抽象基类AbstractCalculator和具体运算子类(加法、减法、乘法),演示了多态在代码组织、可读性和扩展性方面的优势。每个子类重写getResult()方法实现特定运算,主函数通过基类指针调用不同运算,体现了"一个接口,多种实现"的多态特性。相比普通写法,多态实现更易维护和扩展,只需添加新子类即可支持更多运算,而无需修改现有代码。案例突出了多态在面向对象程序设计中的核心价值。
2025-06-10 14:26:54
112
原创 C++_核心编程_多态的基本概念
摘要:本文介绍了C++中的多态概念,分为静态多态和动态多态。静态多态包括函数重载和运算符重载,在编译时确定函数地址;动态多态通过虚函数和继承实现,在运行时确定函数地址。通过Animal、Cat、Dog类的示例演示了动态多态的实现:父类定义虚函数speak(),子类重写该函数,当父类引用指向子类对象时,运行时会调用相应子类的函数。多态需满足继承关系和虚函数重写条件,是C++面向对象编程的重要特性之一。
2025-06-09 10:41:21
244
原创 C++_核心编程_菱形继承
摘要:菱形继承指两个派生类继承同一基类,而另一个类同时继承这两个派生类,形成类继承的菱形结构。主要问题包括数据二义性和重复继承。示例中,Animal是基类,Sheep和Tuo继承它,SheepTuo同时继承Sheep和Tuo,导致m_Age成员出现两份。通过虚继承(virtual public)可解决该问题,确保最终派生类只保留一份基类成员。测试代码展示了虚继承前后成员访问的差异。
2025-06-08 22:03:42
256
原创 C++_核心编程_多继承语法
C++支持多继承,允许子类同时继承多个父类。当不同父类存在同名成员时,需要通过作用域运算符(::)指定访问的父类成员。示例代码展示了Son类继承Base1和Base2两个父类,分别包含同名变量m_A。使用时必须明确指定s.Base1::m_A或s.Base2::m_A来区分。多继承会增加程序复杂性,需谨慎使用以避免命名冲突等问题。
2025-06-08 21:08:48
200
原创 C++核心编程_继承同名静态成员处理方式
问题:继承中同名的静态成员在子类对象上如何进行访问?静态成员和非静态成员出现同名,处理方式一致。访问子类同名成员 直接访问即可。访问父类同名成员 需要加作用域。
2025-06-08 17:07:11
459
原创 C++核心编程_继承同名成员处理方式
当子类与父类拥有同名的成员函数,子类会隐藏父类中同名成员函数,加作用域可以访问到父类中同名函数。问题:当子类与父类出现同名的成员,如何通过子类对象,访问到子类或父类中同名的数据呢?子类对象加作用域可以访问到父类同名成员。子类对象可以直接访问到子类中同名成员。访问子类同名成员 直接访问即可。访问父类同名成员 需要加作用域。
2025-06-08 17:06:16
323
原创 C++_核心编程_继承中构造和析构顺序
/总结:继承中 先调用父类构造函数,再调用子类构造函数,析构顺序与构造相反。子类继承父类后,当创建子类对象,也会调用父类的构造函数。问题:父类和子类的构造和析构顺序是谁先谁后?
2025-06-08 17:04:54
233
原创 C++_核心编程_继承中的对象模型
摘要:本文探讨了C++继承中的对象模型问题。通过Base和Son类示例说明,父类的私有成员(如m_C)虽然被子类继承,但会被编译器隐藏而无法直接访问。测试程序输出Son类对象的大小,验证了即使不可见,父类所有成员(包括私有成员)仍存在于子类对象中。这揭示了继承机制中访问控制与内存布局的区别。
2025-06-04 09:48:14
218
原创 C++核心编程_继承方式
本文介绍了C++中三种类继承方式的语法规则和访问权限控制。主要展示了公共继承、保护继承和私有继承三种方式下,子类对父类成员的访问权限变化。其中,公共继承保持父类成员的原有访问权限,保护继承将父类公共成员变为保护权限,私有继承则将所有继承成员变为私有权限。文中通过具体代码示例演示了不同继承方式下,子类及其派生类对父类成员的访问权限限制。继承方式会影响后续类的成员访问权限,但无论如何,子类都不能提升父类成员的访问权限级别。
2025-06-04 09:33:16
568
原创 C++_核心编程_继承
摘要:继承是面向对象编程的重要特性,通过提取公共属性和方法到基类,再由派生类继承并扩展特有功能,可以有效减少代码重复。以网页开发为例,各页面共用的头部、底部和侧边栏可以封装在基类BasePage中,而Java、Python等子类只需定义各自的内容区,代码复用率显著提高。继承实现的关键语法是"class 子类 : public 父类",既保持了共性又支持个性扩展,相比传统重复编写相同代码的方式,具有更高的维护性和简洁性。
2025-06-04 08:59:37
300
原创 C++核心编程_ 函数调用运算符重载
C++中的函数调用运算符()可以重载,这使得对象能像函数一样被调用,称为仿函数。文中通过两个示例展示仿函数的用法:MyPrint类重载()实现字符串输出功能,MyAdd类实现整数加法。仿函数既可以通过实例对象调用,也可以使用匿名对象形式。这种方式提供了灵活的使用形式,将对象与函数调用的优势结合起来,增强了C++的表达能力。
2025-06-03 09:51:41
294
原创 C++核心编程_关系运算符重载
摘要:本文展示了C++中关系运算符重载的实现方法。通过Person类示例,重载了==和!=运算符,使自定义类型对象能够进行相等性比较。代码中比较了两个人的姓名和年龄属性,当两者都相同时返回true。测试函数test01()创建了两个Person对象并演示了运算符重载的使用效果。该技术扩展了运算符对自定义类型的支持,增强了代码的表达能力。
2025-06-03 09:21:41
232
原创 C++核心编程_赋值运算符重载
C++编译器会自动为类生成4个默认函数:无参构造函数、析构函数、拷贝构造函数和赋值运算符。当类属性涉及堆区内存时,默认赋值运算符会导致浅拷贝问题。示例中Person类通过重载operator=实现深拷贝,先释放原堆内存再新建内存空间拷贝数据。测试代码展示了三个Person对象通过重载的赋值运算符进行链式赋值,确保每个对象拥有独立的内存空间,避免了浅拷贝引发的内存问题。
2025-05-30 17:11:28
768
原创 C++_核心编程_ 左移运算符重载 “<<” 左移运算符
本文演示了如何通过重载左移运算符"<<"实现自定义类型的输出功能。在Person类中,将运算符重载函数声明为友元函数,使其能访问私有成员m_A和m_B。全局重载函数接收ostream引用和Person对象,以链式方式输出对象属性。测试代码创建Person对象p1并直接使用cout输出,验证了重载的有效性。关键点在于:1)使用友元突破封装;2)返回ostream引用实现链式调用。这种方法使自定义类型能像内置类型一样直接输出。
2025-05-29 15:16:53
162
原创 C++核心编程_4.5 运算符重载_4.5.1 加号运算符重载
本文介绍了C++中的运算符重载概念,重点讲解加号运算符重载的实现方法。通过Person类示例,展示了两种重载方式:成员函数形式和全局函数形式。成员函数实现通过this指针访问对象属性,全局函数则通过参数传递对象。同时演示了运算符重载的函数重载特性,如Person对象与整数的相加操作。测试代码验证了重载效果,输出两个Person对象相加及Person对象与整数相加的结果。运算符重载扩展了运算符功能,使其适用于自定义数据类型。
2025-05-28 09:44:14
190
原创 C++核心编程_const修饰成员函数
**常函数:*** 成员函数后加const后我们称为这个函数为**常函数*** 常函数内不可以修改成员属性* 成员属性声明时加关键字mutable后,在常函数中依然可以修改**常对象:*** 声明对象前加const称该对象为常对象* 常对象只能调用常函数
2025-05-26 17:07:03
101
原创 C++_核心编程_空指针访问成员函数
本文探讨了C++中空指针调用成员函数的问题。空指针可以调用不涉及this指针的成员函数(如ShowClassName),但若函数中使用了this指针(如访问成员变量mAge的ShowPerson),则可能导致程序崩溃。为确保代码健壮性,应在成员函数中检查this指针是否为NULL。示例代码演示了如何通过条件判断来避免空指针引发的错误,展示了正确处理空指针调用的方法。
2025-05-26 15:50:54
106
原创 C++核心编程_this指针的概念_
本文介绍了C++中的this指针概念及其应用。this指针是隐含在每个非静态成员函数中的特殊指针,指向调用该函数的对象。主要用于解决成员变量与形参同名时的区分问题,以及实现链式编程返回对象本身。示例代码展示了通过this指针区分同名变量(age)和使用return*this实现链式调用的方法,最终输出p1.age=2和p2.age=60的结果。
2025-05-26 11:10:41
202
原创 C++核心编程_对象模型和this指针
在C++中,类的成员变量和成员函数的存储方式有所不同。非静态成员变量属于类的对象,而静态成员变量、非静态成员函数和静态成员函数则不属于类的对象。代码示例中,Person类包含一个非静态成员变量m_A和一个静态成员变量m_B,以及非静态成员函数func()和静态成员函数func2()。通过test01()函数,可以输出类对象p的大小,结果显示只有非静态成员变量m_A占用了对象的内存空间。静态成员变量m_B在类外初始化,使用作用域解析运算符::。
2025-05-22 10:12:48
110
原创 C++核心编程静态成员
静态成员变量在编译阶段分配内存,类内声明、类外初始化,所有对象共享同一份数据。静态成员函数则共享同一个函数,且只能访问静态成员变量。示例1展示了静态成员变量的声明、初始化和访问方式,包括通过对象和类名访问。示例2则演示了静态成员函数的定义和调用,强调了其只能访问静态成员变量的特性。静态成员函数和变量也有访问权限的限制,私有静态成员无法在类外直接访问。
2025-05-21 16:51:12
94
原创 C++核心编程类对象作为类成员
当一个类的成员是另一个类的对象时,该成员称为对象成员。在创建包含对象成员的类对象时,构造和析构的顺序是固定的。具体来说,构造顺序是先调用对象成员的构造函数,再调用本类的构造函数;析构顺序则相反,先调用本类的析构函数,再调用对象成员的析构函数。例如,在代码中,Person类包含Phone类的对象成员m_Phone。当创建Person对象时,首先调用Phone的构造函数,然后调用Person的构造函数;析构时,先调用Person的析构函数,再调用Phone的析构函数。这种顺序确保了对象成员的正确初始化和清理。
2025-05-21 15:49:01
199
原创 C++核心编程_深拷贝与浅拷贝
该代码展示了C++中深浅拷贝的概念及其实现。浅拷贝仅复制对象的成员变量,而深拷贝则会在堆区重新申请内存空间进行复制,特别是当对象包含指向堆内存的指针时。代码中,Person类包含一个指向堆内存的指针m_height,通过自定义拷贝构造函数实现深拷贝,避免浅拷贝导致的资源管理问题。析构函数负责释放堆内存,防止内存泄漏。test01函数演示了深拷贝的使用,确保两个对象独立管理各自的堆内存。总结:当类成员涉及堆内存时,必须自定义拷贝构造函数实现深拷贝,以确保资源正确管理。
2025-05-21 09:04:00
346
原创 C++_构造函数调用规则
在C++中,编译器默认会为类生成三个函数:默认构造函数、默认析构函数和默认拷贝构造函数。默认构造函数和析构函数无参且函数体为空,而默认拷贝构造函数会对属性进行值拷贝。如果用户定义了有参构造函数,编译器将不再提供默认无参构造函数,但仍会提供默认拷贝构造函数。如果用户定义了拷贝构造函数,编译器将不再提供其他构造函数。代码示例中,Person类展示了这些构造函数的定义和调用规则,并通过test01和test02函数演示了不同情况下构造函数的调用行为。
2025-05-20 16:17:29
205
原创 C++核心编程_拷贝构造函数调用时机
在C++中,拷贝构造函数在以下三种情况下会被调用:1. 使用已创建的对象初始化新对象;2. 以值传递方式向函数传递参数;3. 以值方式返回局部对象。代码示例中,Person类展示了这些情况。test01函数通过已存在的Person对象初始化新对象,test02函数通过值传递调用拷贝构造函数,test03函数通过返回局部对象调用拷贝构造函数。然而,某些编译器(如VSCODE 2022)可能会优化返回值,避免调用拷贝构造函数。
2025-05-20 09:49:48
172
原创 C++核心编程_拷贝构造函数调用时机
构造函数分为无参构造、有参构造和拷贝构造三种类型,分别用于初始化对象、带参数初始化和拷贝对象属性。代码中通过Person类演示了这三种构造函数的实现,通过test01和test02函数展示了构造函数的调用方法,包括括号法、显式法和隐式转换法。此外,代码还强调了调用无参构造函数时不能加括号,以及匿名对象和拷贝构造函数的注意事项。最后,程序通过main函数调用测试函数,展示了构造函数的执行过程。
2025-05-19 15:56:20
196
原创 C++_核心编程_对象的初始化和清理
在C++中,对象的初始化和清理是通过构造函数和析构函数来实现的。构造函数在对象创建时自动调用,用于初始化对象的成员属性;而析构函数在对象销毁前自动调用,用于执行清理工作。构造函数和析构函数的名称与类名相同,构造函数可以有参数并支持重载,而析构函数不能有参数也不支持重载。在示例代码中,Person类定义了构造函数和析构函数,分别在对象创建和销毁时输出信息。通过test01函数创建Person对象后,程序在对象销毁时会自动调用析构函数,确保资源的正确清理。
2025-05-19 09:39:02
349
原创 **练习案例2:点和圆的关系**设计一个圆形类(Circle),和一个点类(Point),计算点和圆的关系。(拆解为.h和.cpp文件)
本文介绍了如何通过C++实现点和圆的关系判断。首先定义了一个Point类,用于表示点的坐标,并提供了设置和获取坐标的方法。接着定义了一个Circle类,包含圆的半径和圆心(Point类对象),并提供了设置和获取半径及圆心的方法。在main函数中,通过计算点与圆心之间的距离平方与半径平方的比较,判断点与圆的位置关系(点在圆内、圆上或圆外)。代码展示了如何创建圆和点对象,并调用check_Point_C函数进行关系判断。
2025-05-16 16:17:10
160
原创 **练习案例2:点和圆的关系**设计一个圆形类(Circle),和一个点类(Point),计算点和圆的关系。
本文介绍了如何通过C++编程判断点与圆的位置关系。首先,定义了一个Point类来表示点的坐标,包含设置和获取坐标的方法。接着,定义了一个Circle类来表示圆,包含半径和圆心坐标的属性,并提供设置和获取这些属性的方法。通过计算点与圆心之间的距离平方与半径平方的比较,判断点是在圆内、圆上还是圆外。最后,通过main函数创建了一个圆和一个点,并调用check_Point_C函数输出点与圆的位置关系。
2025-05-16 15:28:11
212
原创 C++核心编程_练习案例1_设计立法体类
该案例设计了一个立方体类(Cube),用于计算立方体的体积和表面积,并通过成员函数和全局函数判断两个立方体是否相等。类中包含设置和获取长、宽、高的方法,以及计算体积和表面积的函数。成员函数IsSameByClass和全局函数IsSame通过比较两个立方体的体积来判断它们是否相等。在main函数中,创建了两个立方体对象,并分别使用成员函数和全局函数进行相等性判断,最终输出结果。该案例展示了类的封装、成员函数与全局函数的使用,以及对象之间的比较操作。
2025-05-14 15:52:50
210
原创 C++核心编程_struct和class区别_ 成员属性设置为私有
本文介绍了C++面向对象编程中的封装特性,并通过多个示例展示了如何在实际编程中应用封装。首先,封装是将属性和行为作为一个整体,表现生活中的事物,并通过访问权限控制属性和行为的可见性。文章通过设计圆类和学生类,展示了如何将属性和行为封装在类中,并通过公共、保护和私有权限控制访问。此外,文章还比较了struct和class在默认访问权限上的区别,并强调了将成员属性设置为私有的优点,如控制读写权限和检测数据的有效性。最后,通过一个Person类的示例,展示了如何通过私有属性和公共方法实现对数据的有效管理和控制。
2025-05-12 09:44:55
116
原创 3.3 函数重载
函数名可以相同,提高复用性同一个作用域下函数名称相同函数参数类型不同或者个数不同或者顺序不同函数的返回值不可以作为函数重载的条件//3 函数提高//3.1 函数默认参数//在C++ 中,函数的形参列表中的形参是可以有默认值的//语法:` 返回值类型 函数名 (参数= 默认值){}`//}//////1.如果某个位置参数有默认值,那么从这个位置往后,从左向右,必须有默认值////2.如果函数声明有默认值,函数实现的时候不能有默认参数////}//////20//
2025-05-08 09:40:29
148
原创 C++_核心编程04 引用的使用
2.1作用: 给变量起别名语法: `数据类型 &别名 = 原名`2.2 引用注意事项* 引用必须初始化* 引用在初始化后,不可以改变。
2025-04-30 15:51:22
317
原创 武汉地铁客流预测:2025年五一期间总客运量可能达到2800万-2850万乘次。单日峰值:5月1日或5月2日可能突破550万乘次,返程日(5月5日)预计约480万-500万乘次
2025年五一期间,武汉地铁客流将呈现以下特征:总量再创新高:日均约550万乘次,总客运量逼近2850万乘次。结构性增长:2号线、5号线及景点车站成核心增长点,交通枢纽站夜间压力突出。管理升级:通过智慧化手段和动态调度,保障“大客流”下的安全与效率。
2025-04-30 11:17:41
1723
原创 长沙地铁2025年五一假期(5月1日-5日)客流预测分析 整体客流趋势单日峰值创新高:5月1日客流量达392.2万人次,刷新历史单日纪录
长沙地铁1-6号线2025年五一假期(5月1日-5日)客流分析 整体客流趋势单日峰值创新高:5月1日客流量达392.2万人次,刷新历史单日纪录
2025-04-30 10:48:21
1208
1
原创 C++核心编程_指针VS数组
指针和数组是密切相关的。事实上,指针和数组在很多情况下是可以互换的。可以通过使用指针的算术运算或数组索引来访问数组。例如,一个指向数组开头的指针,
2025-04-30 09:27:46
140
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人