自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

wanghao312的博客

嵌入式开发

  • 博客(183)
  • 收藏
  • 关注

原创 使用基类的指针或引用来访问派生类的成员是一种常见的做法,尤其是在实现多态性时

在面向对象编程中,使用基类的指针或引用来访问派生类的成员是一种常见的做法,尤其是在实现多态性时。多态性允许不同类型的对象通过共同的接口(通常是基类的接口)进行交互,这样可以编写更通用、更灵活的代码。这种方法在你知道对象的具体类型时是完全有效的。然而,如果你想要编写可以处理多种形状类型的代码,使用基类指针或引用会更加灵活。这就是多态性的强大之处,它允许你编写更通用的代码来处理不同的对象类型。为什么在有关纯虚函数与抽象类,以及实现动态多态时,函数都能正确地调用相应的。

2024-05-22 14:01:03 208

原创 纯虚函数与抽象类

在C++中,纯虚函数(pure virtual function)是一个在基类中被声明为纯虚的虚函数,它在基类中没有具体的实现,必须在派生类中提供实现。抽象类(abstract class)是一个至少包含一个纯虚函数的类,因此无法直接实例化。抽象类通常用作其他派生类的基类,用于定义接口和共享行为。

2024-05-22 13:40:54 180

原创 `override` 和 `overload`

override用于派生类中,用于指示一个函数重写基类中的虚函数。它要求函数签名必须完全相同。overload发生在同一个作用域内,用于提供多个同名函数,但参数列表不同。重载函数的返回类型可以不同,但通常保持一致。override是C++11引入的关键字,用于增强代码的可读性和可维护性。overload不是关键字,而是描述了一种编程范式,它允许在同一个作用域内定义多个同名函数,以便对不同的输入参数执行不同的操作。

2024-05-22 11:19:08 211

原创 `override`关键字-重写(override)基类中的同名虚函数

派生类中的函数也会自动覆盖基类中的同名虚函数(前提是函数签名相同)。然而,如果函数签名不小心写错了,那么原本意图重写的函数可能会变成一个全新的函数,而不是重写基类中的函数,这可能会导致难以发现的bug。关键字可以提高代码的可读性和可维护性,因为它清楚地表明了函数的意图,并且如果基类中没有相应的可以重写的函数,编译器将会报错。关键字不是强制性的,但使用它是一个很好的编程实践,因为它可以增加代码的清晰度和安全性。函数没有匹配的基类函数可以重写,编译器将会报错,从而避免了潜在的bug。

2024-05-22 11:14:16 299

原创 菱形继承问题-用虚继承解决

需要注意的是,虚继承可能会增加额外的内存和性能开销,因为访问虚基类成员时需要通过指针间接访问。菱形继承问题(也称为钻石问题)是指在一个类继承体系中,当两个类B和C都继承自同一个类A,然后另一个类D同时继承自B和C时,类D将拥有两个类A的实例,这可能导致成员变量和方法的歧义。虚继承允许派生类共享一个基类实例,从而避免了菱形继承中的歧义问题。在这个例子中,类B和类C都使用了虚继承来继承类A。因此,当类D继承自B和C时,它只包含一个类A的实例,这样就解决了菱形继承问题。

2024-05-22 11:13:15 245

原创 菱形继承问题-用虚继承解决

需要注意的是,虚继承可能会增加额外的内存和性能开销,因为访问虚基类成员时需要通过指针间接访问。菱形继承问题(也称为钻石问题)是指在一个类继承体系中,当两个类B和C都继承自同一个类A,然后另一个类D同时继承自B和C时,类D将拥有两个类A的实例,这可能导致成员变量和方法的歧义。虚继承允许派生类共享一个基类实例,从而避免了菱形继承中的歧义问题。在这个例子中,类B和类C都使用了虚继承来继承类A。因此,当类D继承自B和C时,它只包含一个类A的实例,这样就解决了菱形继承问题。

2024-05-21 16:35:31 95

原创 多继承知识点

在使用多继承时,应当注意避免菱形继承问题,可以通过虚继承来解决。同时,多继承可能会使类的层次结构变得复杂,因此在实际编程中应当谨慎使用。在设计类的继承结构时,应当优先考虑组合和接口继承,以保持代码的清晰和可维护性。在C++中,多继承是指一个类可以同时继承多个基类。,这些关键字决定了基类的成员在派生类中的访问权限。其中,继承方式可以是。

2024-05-21 16:34:50 220

原创 多继承知识点

在使用多继承时,应当注意避免菱形继承问题,可以通过虚继承来解决。同时,多继承可能会使类的层次结构变得复杂,因此在实际编程中应当谨慎使用。在设计类的继承结构时,应当优先考虑组合和接口继承,以保持代码的清晰和可维护性。在C++中,多继承是指一个类可以同时继承多个基类。,这些关键字决定了基类的成员在派生类中的访问权限。其中,继承方式可以是。

2024-05-21 16:09:28 303

原创 派生类-访问同名的成员如何做?

如果在C++中一个派生类继承了两个或多个基类,而这些基类中包含了同名的成员,那么在派生类中直接访问这个成员会导致编译器无法确定到底应该访问哪一个基类的成员,从而产生编译错误。在C++类的继承中,如果基类和派生类有同名的成员,派生类会隐藏基类中所有相同名称的成员。这意味着,如果在派生类中直接访问该名称的成员,将会默认访问派生类自己的成员,而不是基类中的同名成员。这样,我们就避免了编译器的歧义错误,并且可以明确地访问到我们想要访问的基类成员。如果需要在派生类中访问被隐藏的基类成员,可以使用作用域解析运算符。

2024-05-21 15:46:31 521

原创 派生类构造函数的一般语法形式如下

在构造函数初始化列表中,首先调用基类。传递给它,然后初始化派生类自己的成员。类的构造函数接受两个参数。

2024-05-21 15:44:37 264

原创 派生类构造函数的一般语法形式如下

在构造函数初始化列表中,首先调用基类。传递给它,然后初始化派生类自己的成员。类的构造函数接受两个参数。

2024-05-21 15:31:20 199

原创 派生类的构造函数,如何给基类的私有数据赋初值?

通常,第一种方式是最常见和推荐的做法,因为它遵循了封装的原则,并且不需要暴露基类的内部实现细节。通过构造函数初始化列表,派生类可以确保基类成员在基类构造函数执行之前得到正确的初始化。在C++中,基类的私有成员不能直接在派生类中被访问或赋值,这是因为私有成员只能在基类内部访问。

2024-05-21 15:25:55 120

原创 构造函数和析构函数的调用顺序遵循特定的规则

离开作用域时,首先会调用派生类。的构造函数,然后调用派生类。的析构函数,然后调用基类。在这个例子中,当你创建。

2024-05-21 15:21:54 276

原创 三种继承方式的特点:public/protected/private

在C++中,基类可以被公有继承(public inheritance)、保护继承(protected inheritance)或私有继承(private inheritance)三种不同的方式继承。这三种继承方式的主要区别在于基类的公有成员和保护成员在派生类中的访问权限。可以看到,不同的继承方式影响了基类成员在派生类中的可访问性,以及派生类对象在外部对这些成员的访问能力。类有三种不同类型的成员:公有、保护和私有。分别以公有、保护和私有方式继承自。

2024-05-21 14:28:13 438

原创 基类被保护继承的特点

在C++中,类的成员可以设置为公有(public)、私有(private)或保护(protected)三种访问权限。会导致编译错误,因为保护成员对外部是不可见的。中直接访问基类的保护成员。类,并可以在其成员函数。

2024-05-21 14:23:29 164

原创 标准模板库支持哪些数据结构和算法?

STL的设计非常灵活和通用,使得它能够应用于各种不同的编程场景和问题。通过使用STL,C++程序员可以避免重复编写常见的数据结构和算法,从而提高开发效率和代码质量。标准模板库(STL)是C++的一个重要特性,它提供了一组模板类和函数,用于常见的数据结构和算法。

2024-05-20 15:05:48 297

原创 静态成员函数的声明与定义

在 C++ 中,将类的成员函数声明为静态的意味着这个函数属于类本身,而不是类的某个具体对象。和一个非静态成员函数。

2024-05-19 18:02:06 219

原创 类的类型转换

C++11引入了显式的类型转换运算符,通过在类型转换运算符前加上explicit关键字,可以阻止编译器进行隐式类型转换,但仍然允许显式类型转换。public:} // 显式的类型转换运算符private:// 错误,不允许隐式类型转换int(obj);// 正确,显式类型转换。

2024-05-19 14:35:42 184

原创 操作符重载-如何可以交换乘法顺序-友元函数

类的成员函数,一次作为非成员函数。函数中,我们演示了两种用法,都能得到相同的结果。的情况,并在类外部定义了这个友元函数。然后,我们声明了一个友元函数。,都可以正常工作,并且会调用相应的。对象与整数相乘可以有两种顺序(即。在这个例子中,我们首先在。作为成员函数,用于处理。

2024-05-17 15:44:50 165

原创 运算符重载知识

在C++中,当重载二元运算符时,运算符的左侧操作数对应于重载函数的第一个参数,而运算符的右侧操作数对应于重载函数的第二个参数。下面分别举一个成员函数重载和非成员函数重载的例子。如果重载的运算符只有一个参数,那么这个参数通常对应于运算符的右侧操作数。这两种重载方式(成员函数和非成员函数)都可以用来重载运算符,选择哪一种取决于运算符的语义和操作数的类型。指向的对象)是隐式传递的,因此整数是运算符的右侧操作数。指针隐式传递的,它指向调用运算符的对象。在这个成员函数重载的例子中,整数参数是显式传递的,而。

2024-05-17 14:58:39 239

原创 C++有哪些多态类型?函数重载、运算符重载

这些多态性机制可以在不同的场景下使用,以提高代码的灵活性和复用性。在面向对象编程中,多态性是一种核心概念,允许以统一的方式处理不同类型的对象。在C++中,多态性是指允许对象采用多种形式的能力。

2024-05-17 14:05:41 270

原创 常函数(常成员函数)是C++类特有的函数

常函数(const member function)是C++特有的概念,C语言中没有这样的特性。在C++中,常函数是指不修改类的任何非静态成员变量的成员函数。通过在函数声明后面添加。都是常函数,因为它们承诺不修改类的任何非静态成员变量。这意味着它们可以被const对象调用,而且它们不能修改对象的内部状态。关键字,可以保证该函数不会修改对象的状态。

2024-05-17 13:41:52 174

原创 用类的知识写一个栈

类是一个ADT,它定义了栈的基本操作:入栈(push)、出栈(pop)、查看栈顶元素(top)、检查栈是否为空(isEmpty)和检查栈是否已满(isFull)。这些操作通过公有成员函数提供,而栈的内部数组(stackArray)、容量(capacity)和栈顶索引(topIndex)作为私有成员变量,外部无法直接访问,确保了数据的安全性。栈是一种后进先出(Last In, First Out, LIFO)的数据结构,它允许在顶部插入(push)和移除(pop)元素。

2024-05-16 18:39:44 442

原创 类作用域知识

在 C++ 中,类作用域是指类定义中声明的成员(包括成员变量和成员函数)所具有的可见性和访问范围。可以看到,我们只能访问公有成员。尝试访问私有或保护成员会导致编译错误。有公有、私有和保护成员。

2024-05-16 18:28:42 367

原创 this指针用法

指针在成员函数中是隐含的,你通常不需要显式地使用它,因为编译器会自动处理对成员变量的访问。然而,在某些情况下,显式使用。指针可以使代码更加清晰,尤其是在处理具有相同名称的局部变量和成员变量时。指针是 const 的,你不能修改它指向的对象。此外,静态成员函数没有。指针,成员函数可以访问调用对象的成员变量和成员函数。在 C++ 中,每一个非静态成员函数都有一个名为。的隐含参数,它是一个指向当前对象的指针。指针,因为它们不与类的特定对象关联。指针指向调用成员函数的对象。

2024-05-16 18:21:01 323

原创 如果你为一个类定义了一个或多个构造函数,但没有显式提供一个无参的默认构造函数,那么这个类就不会有一个默认构造函数供你使用。

默认构造函数是指可以在不提供任何参数的情况下调用的构造函数。使用了提供的非默认构造函数,这是正确的。尝试使用默认构造函数进行初始化,这会导致编译错误,因为类。并提供了一个接受三个参数的构造函数。这样声明对象而不会产生编译错误了。在上面的代码中,我们定义了类。函数中,我们尝试创建两个。这样,程序员就可以像。

2024-05-16 17:55:15 276

原创 在类声明中定义函数等同于内联函数

您提到的“根据改写规则(rewriterule)”,指的是C++编译器在处理类声明中定义的方法时的一种行为。具体来说,当一个方法在类定义内部被完整定义时,编译器会将其视为一个内联函数的定义。然后,在类定义之后,编译器会把这个定义“改写”为外部定义的内联函数。总结来说,当一个方法在类声明中定义时,它会被编译器视为内联函数,并且编译器会把这个定义“改写”为外部定义的内联函数,这样在其他地方调用这个方法时,编译器会直接将函数体插入到调用点,而不是生成一个函数调用的指令。视为内联函数,因为它的定义在类声明内部。

2024-05-16 15:55:15 385

原创 C语言和C++中,结构体有什么不同点?

C语言和C++中,结构体(struct)有一些关键的不同点,主要体现在对结构体的访问控制、成员的默认访问权限、继承和成员函数等方面。

2024-05-16 15:36:34 395

原创 类默认是私有成员,结构体默认是公有成员,联合体和枚举没有这个概念,可以视为公有

的成员默认都是公有的,而。的枚举值是全局可见的。

2024-05-16 15:25:47 121

原创 命名空间namespace的用法

命名空间通过关键字namespace后跟命名空间的名字来定义。在命名空间内部,可以定义变量、函数、类等。

2024-05-16 11:28:50 328

原创 解释C++中的存储说明符是什么意思

在C++中,存储说明符(storage specifiers)是用于声明变量、函数或其他符号时,指定其存储属性的关键字。存储说明符影响变量的存储期限、链接性以及可见性。

2024-05-16 11:05:55 501

原创 静态局部变量和静态全局变量

静态局部变量(static local variable)是在函数内部声明的,具有静态存储期限的变量。这意味着它的生命周期从程序开始时开始,直到程序结束,而不是在函数调用时创建和销毁。静态局部变量只会被初始化一次,即使在函数被多次调用时也是如此。的值都会增加,并且记住上一次调用的值,因为它在函数调用之间保持不变。这些是C++中主要的静态变量类型,它们在程序中的作用和用途各不相同。初始化为0,然后增加到1,并打印出来。后续的调用会继续增加。都会被重新初始化为0,因此每次都会打印1。不是静态的,那么每次调用。

2024-05-16 10:52:59 107

原创 函数重载解析的匹配规则

简而言之,重载解析将寻找域匹配的函数。如果只存在一个这样的函数,则选择它:如果存在多个这样的函数,但其中只有一个是非模板函数,则选择该函数:如果存在多个适合的函数,且它们都为模板函数 ,但其中有一个函数比其他函数更具体,则选择该函数。如果有多个同样合适的非模板函数或模板函数,但没有一个函数比其他函数更具体, 则函数调用将是不确定的,因此是错误的;当然,如果不存在匹配的函数,则也是错误。在C++中,函数重载解析是一个复杂的过程,它涉及到完全匹配、最佳匹配、模板的部分排序匹配和用户提示选择函数。下面详细讲述这

2024-05-15 14:39:19 209

原创 模板的实例化和具体化

在C++中,模板的实例化(instantiation)和具体化(specialization)是两个相关但不同的概念。

2024-05-15 14:04:40 464

原创 函数模板自动完成重载函数的过程。只需使用泛型和具体算法来定义函数,编译器将为程序中使用的 特定参数类型生成正确的函数定义。

当编译器遇到一个函数模板的调用时,它会根据调用时提供的实际参数类型来推断模板参数的具体类型,然后生成一个具体的函数定义,这个过程称为模板实例化(Template Instantiation)。在编写程序时,我们经常会遇到对不同的数据类型执行相同或相似操作的情况,例如,比较两个数的大小,不管这两个数是整数、浮点数还是其他数值类型,比较的过程都是类似的。在函数模板中,我们使用一个或多个类型参数来表示这个函数可以接受的数据类型,这些类型参数在函数定义时是不具体的,只有在函数调用时才会被替换为具体的类型。

2024-05-15 12:52:41 295

原创 什么是常成员函数

这种函数承诺不会修改调用它的对象的状态。换句话说,一个常成员函数可以读取对象的数据成员,但不能修改它们。,那么它只能调用常成员函数,不能调用其他成员函数,因为非常成员函数可能会修改对象的状态,这是不允许的。常成员函数也可以重载非常成员函数,这为对象的操作提供了更多的灵活性。如果对象是非常对象,那么可以根据上下文选择调用非常版本或常版本。常成员函数的一个主要用途是允许常对象调用它们。关键字时,你就告诉编译器这个函数是常成员函数。的值,所以它不是常成员函数。是一个常成员函数,它返回。的对象是常对象,它会调用。

2024-05-15 12:31:10 381

原创 列举C++特有而C语言没有的特性

C++ 在 C 语言的基础上增加了很多面向对象编程的特性,以及其他一些改进。

2024-05-14 15:32:55 700

原创 介绍c++中new 和delete关键字的内容与用法

在C++中,new和delete是两个关键字,分别用于动态内存分配和释放。

2024-05-14 15:04:27 255

原创 在C++中,`using`指令有几种不同的用途

【代码】在C++中,`using`指令有几种不同的用途。

2024-05-14 13:49:42 287

原创 C++语言和标准库的关系--相辅相成

库不是C++语言内置的直接组成部分,但它是C++标准的一部分,因此在任何符合标准的C++编译器中都可以使用。这些类的设计和实现是为了提供一个统一的、类型安全的、可扩展的输入输出框架,使得在C++程序中进行输入输出操作变得容易和一致。库)提供了一系列的类和函数,这些类和函数不是语言内置的,但是它们是C++标准的一部分,并且在每个C++实现中都可以使用。这些类并不是C++语言内置的直接组成部分,而是作为标准库的一部分提供的,这意味着它们是由C++标准委员会定义并在每个C++实现中提供的。

2024-05-14 13:01:17 160

文件搜索工具,使用Python编写,然后压成一个.exe文件 该文件可以直接在Windows系统上运行

文件搜索工具,使用Python编写,然后压成一个.exe文件。该文件可以直接在Windows系统上运行。支持文件名称关键词搜索,即使文件名称输入不全也能搜索到。

2023-07-21

C++中引用(&)相关知识

C语言中的指针,和C++中的引用(&),在做函数形参的时候有很多相似的地方,为了方便查阅异同,截取了一部分关于引用的知识。

2023-07-17

用Python写的一个监控自己电脑各项参数的小程序

实时监控自己电脑的运行时间、使用率、内存使用率、CPU速度等参数,后期还可以扩展监控范围。

2023-07-15

python写的笔记本小程序

使用Chat gpt 通过发布命令写成的一个小程序。并且通过pyinstaller功能生成了.exe可执行文件。 后续会将源代码上传。

2023-07-14

空空如也

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

TA关注的人

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