![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++从基础到抗大旗
文章平均质量分 80
程序小白Erike.
深度学习,机器学习、人工智能、图像缺陷检测、音视频流媒体方向;主要学习C/C++、python语言,入行两年半,尚只接触到门槛,要走的路还很长。基本全是自学,看书,没有导师教。走了不少冤枉路,也看了不少书和视频。这里主要还是记录一下自己学习的笔记,希望能不断进步。继续前进。
展开
-
【带头学C++】----- 九、类和对象 ---- 9.13 运算符重载——9.13.9 设计MyString类案例
现在我们结合之前笔记学习内容,设计一个MyString的类,进行自主的调用,自己写一些方法,获取字符串的大小,重载运算符,使用一些特殊的重载符号,构建一个自定义的MyString字符串操作的类。无参构造拷贝构造获取字符串大小长度析构函数,释放指针成员空间。原创 2023-12-14 15:48:32 · 1031 阅读 · 0 评论 -
【带头学C++】----- 九、类和对象 ---- 9.13 运算符重载——(9.13.7-9.13.8)
解决办法很简单,例如当编译器看到++a(前置++),它就调用operator++(a),当编译器看到a++ (后置++),它就会去调用operator+t(a,int).a++ (后置++),它就会去调用operator++(a,int)a-- (后置--),它就会去调用operator--(aint)++a(前置++),它就调用operator++(a),-a(前置--),它就调用operator--(a)当我们想要实现下面这样的关系时,实现对象的比较判断是否相等的情况;原创 2023-12-14 14:59:50 · 1014 阅读 · 0 评论 -
【带头学C++】----- 九、类和对象 ---- 9.13 运算符重载——(9.13.5-9.13.6)
重载加法运算符,实现全局函数和成员函数(推荐使用)分别重载了加法运算符。上节实现了输入输出运算符重载,那么我们怎么实现下面这样的情况呢?这里就是上一节我们输出的时候,第二参数传的是引用类型。原创 2023-12-12 17:58:54 · 463 阅读 · 0 评论 -
【带头学C++】----- 九、类和对象 ---- 9.13 运算符重载——(9.13.1-9.13.4)
C++ 中的运算符重载允许用户对已存在的运算符进行重新定义,赋予其另一种功能,以适应自定义类型的操作。运算符重载通过特殊的函数名称和语法来实现,在函数中定义了对应运算符的操作。语法:定义重载的运算符就像定义函数,只是该函数的名字是operator@,这里的@代表了被重载的运算符。原创 2023-12-12 17:29:42 · 1054 阅读 · 0 评论 -
【带头学C++】----- 九、类和对象 ---- 9.12 C++之友元函数(9.12.5---9.12.7)
友元关系不能被继承。A类、B类是A类继承的子类,C类是A类的友元,但不一定是B的。除非你主动增加一个友元声明。友元关系是单向的,类A是类B的朋友,但类B不一定是类A的朋友。友元关系不具有传递性。类B是类A的朋友,类C是类B的朋友,但类C不一定是类A的朋友原创 2023-12-11 18:05:10 · 537 阅读 · 0 评论 -
【带头学C++】----- 九、类和对象 ---- 9.12 C++之友元函数(9.12.1---12.4)
在 C++ 中,友元函数是指在一个类的外部定义的、被该类声明为友元的非成员函数。友元函数可以访问该类的所有成员(包括私有成员),并且可以在不通过类对象进行访问的情况下改变成员的值。原创 2023-12-11 17:22:22 · 1031 阅读 · 0 评论 -
【带头学C++】----- 九、类和对象 ---- 9.11 面向对象模型
C++面向对象最重要的特征之一,就是实现了“封装”、“数据”以及“函数(里面是对数据的操作)”是分别存储的,c++中的非静态数据成员直接内含在类对象中,成员函数虽然内含在class声明之内,却不出现在对象中。每一个非内联成员函数只会诞生一份函数实例。此时我们需要考虑一个问题,使用sizeof(Data)计算类的对象所占空间大小是多少?实际上,我们这个类的大小只有a、和b的大小charint记住内存对齐原则:对齐是自身类型的,并且对象的大小包括其成员变量的大小和可能引发的对齐要求所增加的。原创 2023-12-08 15:43:40 · 960 阅读 · 0 评论 -
【带头学C++】----- 九、类和对象 ---- 9.10 C++设计模式之单例模式设计
通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。实际上Qt的设计模式和C++基本上相差无几,Qt就是C++的图形GUI库,其底层实现完全结合了C++的知识,可以直接使用C++进行混合编程,那看完了Qt的相关的设计模式介绍,那么我们接下来,主要学习的是C++中单例设计模式的一些基本概念和实现;在单例模式中,类的构造函数必须是私有的,以防止在类的外部对其进行实例化。看过我之前的文章的,简单讲解过C++/Qt的设计模式。首先:C++单例设计模式是什么?原创 2023-12-08 13:47:33 · 1454 阅读 · 0 评论 -
【带头学C++】----- 九、类和对象 ---- 9.9 静态成员
C++ 中的静态成员是属于类本身而不是类的实例的成员。使用关键字 static 修饰声明为静态的,称为静态成员,那么无论这个类创建了多少个对象静态成员只有一个拷贝,这个拷贝是被所以属于这个类的对象进行共享。这与非静态成员不同,非静态成员是每个对象独有的,每个对象都有自己的一份副本。通过静态成员,可以在不创建类的实例的情况下共享数据或功能,或者作为类级别的计数器等用途。static修饰的静态成员,属于类而不属于对象。(所有对象共享一份静态成员数据)静态成员函数只能操作静态成员变了,不能操作普通成员变量。原创 2023-12-07 16:19:23 · 1019 阅读 · 0 评论 -
【带头学C++】----- 九、类和对象 ---- 9.8 动态对象创建
在创建数组时,我们通常需要预先指定数组的长度,然后编译器会为数组分配相应大小的空间。然而,在使用数组时会出现一些问题。一方面,可能会造成空间的浪费,因为数组的空间可能会过大。另一方面,可能会出现空间不足的情况。因此,对于数组来说,动态的意思表示了空间分配的不确定性。为了解决这个普遍的编程问题,最基本的要求之一就是可以在运行时创建和销毁对象。虽然 C++ 提供了动态内存分配的函数(如 malloc 和 free),可以在运行时从堆中分配存储单元,但这些函数在 C++ 中并不能很好地完成对象的初始化工作。原创 2023-12-07 15:11:48 · 900 阅读 · 0 评论 -
【带头学C++】----- 九、类和对象 ---- 9.7 类的对象数组
在上面的示例中,我们定义了一个名为Student的类,它具有名称(name)和年龄(age)属性以及一个显示(display)方法。然后,我们声明了一个包含3个Student对象的数组students,并初始化它们的值。首先,我们需要定义一个类,然后声明一个对象数组来存储该类的多个对象。下面是一个简单的例子:C++可以使用类的对象数组来存储同一类的多个对象。类的对象数组指的是同一类的多个对象按照数组的形式存储起来。通过这种方式,我们可以创建一个包含多个同类型对象的数组,并对每个对象进行操作。原创 2023-12-06 16:37:41 · 340 阅读 · 0 评论 -
【带头学C++】----- 九、类和对象 ---- 9.6 C++中的explicit关键字(c++11)
使用关键字explicit时,编译器将不会自动将该构造函数用于隐式类型转换。这意味着,在使用该构造函数创建对象时,必须显式地调用该构造函数。(或者除了第一个参数外其余参数都有默认值的多参构造)而言。是一个关键字,用于修饰单参数的构造函数,用来。在C++中,explicit。当一个构造函数被声明为explicit时。原创 2023-12-06 10:14:04 · 860 阅读 · 0 评论 -
【带头学C++】----- 九、类和对象 ---- 9.5 初始化列表
下例中,B类中定义了A类的对象,ob就是B类中的对象成员,构造顺序是先构造成员对象的无参构造,再构造自身的无参构造函数。但是析构的时候则相反的,先析构自身的,再析构A类的析构函数。先调用对象成员的构造函数,再调用本身的构造函数。在类中定义的数据成员一般都是基本的数据类型。但是类中的成员也可以是对象,叫做对象成员。那么调用这个对象成员的有参构造函数去传递值,这时候就像下面这样写的一样。下面这个写就可以调用成员对象的有参构造方法了。对比下之前的写法:此时会调用无参构造,无法调用有参构造。原创 2023-12-05 16:04:04 · 439 阅读 · 0 评论 -
【带头学C++】----- 九、类和对象 ---- 9.4 拷贝构造函数、赋值
函数返回一个局部对象的引用或指针:如果函数返回一个局部创建的对象的引用或指针,则需要确保在函数返回后对象仍然有效。使用拷贝构造函数或拷贝赋值运算符:当我们显式地使用拷贝构造函数或拷贝赋值运算符来创建或赋值对象时,也会触发对象的拷贝操作。以值的方式传递或返回对象:当我们将对象作为参数传递给函数或者从函数中返回对象时,也会触发对象的拷贝操作。赋值运算符:当我们使用赋值运算符将一个对象的值赋给另一个对象时,会触发对象的赋值操作。赋值操作会将原始对象的值复制到新的对象中,并且它们将引用相同的内存空间。原创 2023-12-05 14:09:25 · 914 阅读 · 0 评论 -
【带头学C++】----- 九、类和对象 ---- 9.3 析构函数
当对象生命周期结束的时候,系统自动调用析构函数(析构函数会先清理对象占用内存空间存放的内容,最后释放该对象的空间)一般情况下,空的析构函数就足够。但是如果一个类有指针成员,这个类必须写析构函数,释放指针成员所指向空间。看下面这个顺序进行释放,{} 代表一个生命周期,或者说作用域。没有返回值类型,没有函数形参。先调用析构函数,再释放对象的空间。对象在生命周期结束就会消亡。原创 2023-12-01 17:47:18 · 491 阅读 · 0 评论 -
【带头学C++】----- 九、类和对象 ---- 9.2 构造函数
目录9.2 构造函数9.2.1 初始化声明构造函数9.2.1 构造函数的概述9.2.3 构造函数定义方法9.2.4 提供构造函数的影响以下是一些C++引入构造函数的原因:简单理解一件事:定义声明变量、函数进行一些初始值让程序在第一次运行的时候,使用一个默认值,比如计数器,你要让计数的int型初始处于0的位置,你就要对这个int型的变量,在程序启动的时候设置一个初始化值,原创 2023-12-01 16:44:34 · 1169 阅读 · 0 评论 -
【带头学C++】----- 九、类和对象 ---- 9.1 类和对象的基本概念----(9.1.4---9.1.6)
现在如下图所示题目,设计一个立方体类,并且可以求出立方体的面积、体积,并最后判断是否相等,这里严格来说应该是设计一个长方体,立方体是长宽高都相等才是。类在其他源文件的实现步骤(实现类在不同文件的实现,后续引出构造函数)注意:类定义在同文件testclass.h中,而testclass.cpp是用来实现(声明)类的成员函数文件。原创 2023-11-30 16:04:55 · 914 阅读 · 0 评论 -
【带头学C++】----- 九、类和对象 ---- 9.1 类和对象的基本概念----(9.1.1---9.1.3)
定义类的关键字:class设计一个类步骤: 思考该类有哪些数据成员 操作这些数据的成员函数 数据一般默认都是设计成私有, 成员函数为公有,通过成员函数操作数据,来实现对类和对象的一些操作。注意,私有、保护成员变量不能直接在类的外部进行访问//类中默认为私有private:int a;//私有成员变量,不用给类中成员初始化protected:int b;//受保护的成员变量public:int c;//公有的成员变量//在类的内部,不分权限之分int main()原创 2023-11-30 14:33:57 · 998 阅读 · 0 评论 -
【带头学C++】----- 八、C++面向对象编程 ---- 8.10 函数的默认参数
C++在声明函数原型的时可为一个或者多个参数指定默认(缺省)的参数值,当函数调用的时候如果没有指定这个值,编器会自动用默认值代替。通过为函数参数指定默认值,可以在调用函数时省略相应的参数,而该参数将使用默认值。如果调用函数时提供了该参数的值,则它将覆盖默认值。再看案例:注意点1:形参按照参数位置的顺序传值,注意点2:默认函数碰上函数重载的时候,注意调用时的。原创 2023-11-29 18:09:21 · 548 阅读 · 0 评论 -
【带头学C++】----- 八、C++面向对象编程 ---- 8.8 内联函数 inline
函数重载,是c++的多态的特性 (静态多态)函数重载: 用同一个函数名来表示不同的函数功能。例如:吃饭,吃饭可以是大口吃、小口吃、快吃、慢吃、可以喝、可以咬吞咽嚼烂。这些都叫吃饭,根据外面传进来的食物,使用不同的方法处理这个食物,比如吃东西进来是咀嚼、还是漱口水,处理的方式不一样,骨头你还要啃,就像牙齿有不同的功能一样。函数重载允许我们使用相同的函数名来表示处理不同类型的数据或参数组合的操作。通过函数重载,我们可以根据不同的参数类型或参数个数来选择相应的函数进行调用。函数名称相同,但参数列表不同。原创 2023-11-29 17:04:11 · 913 阅读 · 0 评论 -
【带头学C++】----- 八、C++面向对象编程 ---- 8.7 引用(Reference)&
在C/C++中指针的作用基本都是一样的,但是C++增加了另外一种给函数传递地址的途径,这就是按引用传递(pass-by-reference)。变量名实质上是一段连续内存空间的别名,是一个标号(门牌号)程序中通过变量来申请并命名内存空间通过变量的名字,可以使用存储空间对一段连续的内存空间只能取一个别名吗?C++11开始以后新增了引用的概念,引用可以作为一个以及存在的。2.给那个变量取别名,就定义一个相同的类型。int &b = a;//给变量a取引用的别名,叫b。3.从上往下整体替换。原创 2023-11-28 16:22:15 · 823 阅读 · 0 评论 -
【带头学C++】----- 八、C++面向对象编程 ---- 8.5 struct结构体类型增强使用说明
int mAge;mAge = age;注:1.添加#include 引入string文件库2.string类型在使用cout的时候,需要使用 " .c_str() " 转换成c语言string风格,C++可以不加头文件直接输出char字符类型。是一个类类型,属于标准 C++ 库中的类,用于包装和操作字符串。而char是字符类型,可以表示单个字符。提供了许多成员函数和操作符重载,使得对字符串的操作和处理更加方便和灵活。它支持动态修改字符串的长度、连接、查找、比较等操作。原创 2023-11-28 14:17:13 · 1044 阅读 · 0 评论 -
【带头学C++】----- 八、C++面向对象编程 ---- 8.1 面向对象编程概述
面向对象(Object-Oriented)是一种编程范式,它将程序设计中的数据和操作封装成对象。封装、继承和多态。封装(Encapsulation)是指将数据和操作封装在一个对象中,对象对外提供接口来访问和操作数据,同时隐藏具体的实现细节。这样做可以提高代码的可维护性、可重用性和安全性。继承(Inheritance)是指通过定义新的类,这个新的类可以继承已有类的属性和方法。通过继承,新的类可以扩展或修改已有类的功能。继承可以减少代码的冗余,并支持代码的重用。多态(Polymorphism)原创 2023-11-23 18:08:20 · 1122 阅读 · 0 评论 -
【带头学C++】----- 一、 基础知识 ---- 入门篇(上,简单了解)
第一章:C++入门。本章主要介绍一下c++的历史和一些基础知识,包括学习c++的环境搭建的一些链接,大家感兴趣可以看看。原创 2023-10-19 16:12:59 · 64 阅读 · 0 评论 -
【带头学C++】----- 一、基础知识 ---- 入门篇(下篇)
整型常量(Integer Constants)关键字:int整型常量是指表示整数值的常量。在 C++ 中,我们可以使用多种进制来表示整型常量,包括十进制、八进制和十六进制。十进制常量:使用十进制数字表示的整数常量。// 十进制常量,值为 123八进制常量:使用前缀0表示的八进制数字表示的整数常量。// 八进制常量,值为 83(相当于十进制的 83)十六进制常量:使用前缀0x或0X表示的十六进制数字表示的整数常量。// 十六进制常量,值为 291(相当于十进制的 291)L 或 l 后缀。原创 2023-10-20 16:10:08 · 246 阅读 · 0 评论 -
【带头学C++】----- 七、链表 ---- 7.5 学生管理系统(链表--下)
【代码】【带头学C++】----- 七、链表 ---- 7.5 学生管理系统(链表--下)搜索链表、删除链表、释放链表原创 2023-11-20 15:25:16 · 72 阅读 · 1 评论 -
【带头学C++】----- 七、链表 ---- 7.5 学生管理系统(链表--上)
本章节小节记录的是数据链表的学生管理系统实现方法,主要有链表的创建、链表插入、链表遍历,此前所学还是单向链表,后续会退出单向循环链表、双向链表、双向循环链表等;原创 2023-11-20 14:08:38 · 365 阅读 · 0 评论 -
【带头学C++】----- 七、链表 ---- 7.1 链表的概述
链表是由一个个节点组成,节点没有名字,每个节点从堆区动态申请,节点间物理上是非连续的,但是每个节点通过指针域 保存下一个节点的位置达到逻辑上连续。不带头结点就是使用一个指针变量来保存第一个结点的地址。带头结点的就是牺牲一个空结点(数据区域不存储数据)来存储第一个结点的地址。//数据域int num;//指针域。原创 2023-11-16 16:26:39 · 480 阅读 · 1 评论 -
【带头学C++】----- 六、结构体 ---- 6.9 共用体以及枚举类型
结构体:结构体用于组合不同类型的数据,每个字段占用独立的内存空间。共用体:共用体也组合不同类型的数据,但所有字段共享同一块内存。因此,结构体适合表示具有多个属性的对象,而共用体适合表示可以具有不同值的数据。-------结构体struct关键字-----------------------------------共用体使用union关键字---------共用体占用的内存大小:由内部最大成员变量类型大小决定。原创 2023-11-16 15:50:46 · 102 阅读 · 0 评论 -
【带头学C++】----- 六、结构体 ---- 6.7 结构体的对齐规则
结构体中最大的基本类型长度决定成员偏移量=成员自身类型的整数倍 需要根据你所在平台的位数,32位和64为类型大小不一样。cpu一次读取的大小也不一样,32位是一次读取4字节,64位是一次读取8字节。占用的大小的字节数也不一致的,需要经常记忆。结构体的总大小=分配单位整数倍复习带背书:#pragma pack(value)时的指定对齐值value。注意value值为1 2 4 8 16原创 2023-11-15 14:39:37 · 428 阅读 · 0 评论 -
【带头学C++】----- 六、结构体 ---- 6.6 结构体的指针成员
通过指针,可以访问到我们结构体变量的值可以通过 -> 符号 访问到结构体变量name是一个指向const char的指针,在 C++11 之前的版本中,可以将字符串字面值直接赋值给类型的指针。但从 C++11 开始,需要将name的声明改为,以便与字符串字面值类型匹配。通过在name声明中添加const关键字,表示name是一个指向常量字符串的指针,并且可以安全地将字符串赋值给类型的指针。这样就符合了 C++11 引入的更严格的类型匹配规则。原创 2023-11-14 16:24:38 · 284 阅读 · 1 评论 -
【带头学C++】----- 六、结构体 ---- 6.1 结构体概述
语法:struct 结构体类型名成员列表;// 注意此处有分号例如对应1中的问题进行定义一个结构体:// 定义学生结构体//系统不会为结构体类型开辟空间 只会为结构体类型定义的变量开辟空间此时是非法的,不要对结构体变量初始化(后续再结合C++11、17、20讲)int stunum;//正常定义的结构体成员变量int age;char sex;//结构体成员拥有独立的内存空间//定义结构体类型的变量。原创 2023-11-14 14:17:19 · 131 阅读 · 1 评论 -
【带头学C++】----- 五、字符串操作函数 ---- 5.1 字符串操作函数
注意:此时我使用的qt5.13.2对这个函数进行了警告:warning: 'strcpy' is deprecated: This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.函数被标记为不安全的,并且在一些编译环境中被认为是不建议使用的。原创 2023-11-13 17:22:15 · 169 阅读 · 1 评论 -
【带头学C++】----- 四、动态内存空间申请 ---- 4.1 动态内存分配(补充面试背题)
malloc和free是库函数,它们是已经编译好的代码,无法直接为对象调用构造函数和析构函数,因此无法满足对象的完整创建和销毁过程的需求。因此,对于非基本数据类型的对象,使用new和delete是必不可少的,以保证对象的完整创建和销毁过程。malloc和free主要用于分配和释放内存的基本数据类型和未初始化的内存,对于对象的管理则需要使用new和delete来实现。的标准库函数,以分配足够大的、原始的、未类型化的内存,用于保存指定类型的一个对象;的标准库函数,用于分配足够的空间,并调用相关对象的构造函数;原创 2023-11-13 13:47:25 · 448 阅读 · 1 评论 -
【带头学C++】----- 四、动态内存空间申请 ---- 4.1 动态内存分配
在C和C++等语言中,可以使用malloc、calloc、realloc或使用new等函数来动态分配内存空间,同时使用free、delete函数释放动态分配的内存空间,这样可以根据程序的实际需要动态管理内存,避免静态内存分配的局限性。在数组一章中,我们讨论了数组的长度是在编程时预先定义好的,其大小在整个程序中都是固定的,无法动态改变。然而,在实际的编程中,我们经常会遇到一种情况,即所需的内存空间取决于实际输入的数据,而无法事先确定。原创 2023-11-10 14:52:17 · 430 阅读 · 1 评论 -
【带头学C++】----- 三、指针章 ---- 3.10 函数指针(补充基础知识)
将函数内部的合法地址通过返回值 返回给函数外部使用注意:函数不要返回普通局部变量的地址分析:在这段代码中,函数getAddr()返回一个指向局部变量data地址(作用域是函数内部)的指针,然后在test04()函数中将返回的指针赋值给p。然而,这样做会导致段错误。原因在于getAddr()函数返回指向data的指针,而data是一个局部变量,当getAddr()函数执行完毕后,data将被销毁,这意味着p。这种情况称为不让其被释放。原创 2023-11-10 14:07:50 · 215 阅读 · 1 评论 -
【带头学C++】----- 三、指针章 ---- 3.11 补充重要指针知识(二,拓展基础知识)
如果想在函数内部修改外部变量的值,可以将外部变量的地址传递给函数。在C/C++中,函数的参数传递方式有值传递(传递变量的副本)和引用传递(传递变量的地址)。如果希望函数内部修改外部变量的值,需要使用引用传递或指针传递。原创 2023-11-09 16:04:46 · 427 阅读 · 0 评论 -
【带头学C++】----- 三、指针章 ---- 3.8二维数组与数组指针的关系(二,补充)
arr[1] => *(arr+1) 第一行第0列的列地址。在上一节3.8中,对于二维数组的笔记中我觉的还缺少一些基础性建设,所以在此进行补充。&arr[1] => &*(arr+1) =>arr+1 第1行的行地址。arr[1]+2 => *(arr+1)+2 => 第1行第2列的列地址。*(arr+1) => 第0行第1列的列地址。(引用千锋教育基础班笔记的一些记录)原创 2023-11-09 14:39:30 · 276 阅读 · 0 评论 -
【带头学C++】----- 三、指针章 ---- 3.11 补充重要指针知识
也就是说,它存储了一个指向指针的内存地址。在C++中,指针的指针可以用来传递多个指针参数,或者用于在函数内部动态分配内存,以及实现其他高级的指针应用。指针的指针还可以用于函数参数传递,特别是在需要动态创建多个指针变量时。指针的指针(Pointer to Pointer)是指一个。来访问和操作指针的指针。例如,以下代码演示了如何使用指针的指针来访问。该函数使用指针的指针动态创建了一个二维数组,并将其赋值给。,并将其赋值为10。来解除指针的指针,并得到所指向的值。在上面的代码中,我们定义了一个指针的指针变量。原创 2023-11-07 15:45:46 · 233 阅读 · 0 评论 -
【带头学C++】----- 三、指针章 ---- 3.10 函数指针作为函数的参数
在C++中,函数指针可以作为函数的参数传递,这样可以灵活地在运行时决定调用哪个函数。函数接收两个操作数和一个函数指针作为参数,根据函数指针的值来决定调用哪个具体的操作函数。在上面的示例中,我们首先定义了一个函数指针类型。然后,我们实现了两个具体的操作函数。原创 2023-11-07 14:32:18 · 95 阅读 · 0 评论