自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(76)
  • 收藏
  • 关注

原创 map和set的使用

multimap的使用和map大致相同,但因为multimap的key会对应多个value,所以multimap没有operator[]函数,这也是map和multimap最大的区别,还有一些区别,比如insert的返回值,与map不同,multimap的插入是必定成功的,所以multimap插入函数的返回值是iterator。set是一个模板,T就是key,compare则是比较方式,如果默认的less不符合要求,比如指针,要求按指向数据的大小比,而不是按指针地址比,就需要自己写比较方式。

2023-08-09 18:10:17 265

原创 二叉搜索树的模拟实现

以图示搜索树为例,如果要找8,8比6大,必然在6的右子树,8比9小,必然在9的左子树,8又比7大,在7的右子树,找到8。基础的二叉树用的其实不多,二叉树的重点在二叉树的延伸:二叉搜索树。//数值交换后,新的树依然满足搜索二叉树,交换的值是右子树的最小值,且比key大,key一定还是新树的最小值。//找到删除节点左子树中最大的节点,或者右子树中最小的节点,替换原来节点中_key的值,再删除找到的节点。//节点与子树的关系,比如将根节点与根的左节点交换,根节点就会变成原树的左节点,树会变成原树的左子树。

2023-08-01 23:05:08 310

原创 关于vs下多态虚表中存储的地址和实际成员函数地址不一样的原因

编译正常,B,C中各有一个虚表,可以储蓄对A中虚函数的重写,但是,如果B,C是虚拟继承就会报错,在虚拟继承下,B,C中存储A的未知统合为一块区域,(B,C中存储指向虚基表的指针,指针指向的虚基表中存储有对A区域的偏移量)这样就会导致编译器不知道在A的虚表中储存B中的重写,还是C中的重写。虚表中存储的地址是edx存储的地址。这是因为vs对成员函数实现了封装,虚表中储存的地址是封装位置的地址,虽然存储的地址不一样,但是最终还是调用到了Derive::func1,说明还是跳转到func1的位置了。

2023-08-01 23:04:29 402

原创 多态的原理

那么具体是哪一个呢?对d的地址解引用拿到d的全部空间,对d的地址前4个字节解引用(如果是64位,要取前8字节),拿到_vfptr中存储的数据(_vfptr的地址和d是一样的,_vfptr是指针数组首元素的地址,不是首元素),此时为int类型的变量,强转为func类型的后传入print函数的参数a中,a[i]调用虚表中的第i个数据,加上函数调用符'()',调用指针指向的函数。答案是会调用派生类的虚函数,这就违反多态的规定(指向什么类型,调用什么类型的虚函数,明明指向的是一个基类,却调用了派生类的虚函数)了。

2023-07-14 20:31:50 236

原创 多态的基本使用

所以在继承的部分,在派生类的析构函数中调用基类的析构函数且不声明作用域会报错(虽然派生类会在结束自动调用基类的析构函数,不需要再调用,但这里只是解释一下为什么在派生类调用基类的析构函数会报错,即使派生类和基类都没有成员变量(有成员变量就可能需要释放空间,对一个空间释放两次就会报错)),两种析构函数都被处理成destructor的形式了,会导致无限递归。虚函数的重写:派生类中有一个跟基类完全相同的虚函数(即派生类虚函数与基类虚函数的返回值类型、函数名字、参数列表完全相同),称子类的虚函数重写了基类的虚函数。

2023-07-14 20:31:39 405

原创 菱形继承及菱形虚拟继承

可以看到两个指针直接指向的位置都为0,直接指向位置的下一个位置则是两个数字,B为20,C为12,这个20,12实际上是偏移量,用来指向_a所在的位置,在B中存储指针的位置向下偏移20,就得到_a的位置。顺便说一下,当数据的情况复杂到一定程度,vs编译器的监视窗口就不一定准确了(vs2013对下面的代码显示不准确,vs2019能正确显示,但是要深入了解虚拟继承如何解决问题,还是得用内存窗口),这时要想得到准确的数据就要使用内存窗口。有了多继承,就存在菱形继承,有了菱形继承就有菱形虚拟继承,底层实现就很复杂。

2023-07-04 17:27:54 328

原创 继承的基本内容

当然派生类天然赋值给基类的前提条件是public继承(基类成员变量被public和protected修饰都可以将派生类赋值给基类),如果是protected继承,继承的基类会变成protected成员,在student类类外是不能访问(读取也算访问)继承的基类部分的,就不能将派生类的基类部分赋值给基类。如图所示,基类和派生类中存在相同的变量名_num,在没有指定作用域时,在派生类中访问_num时,基类的_num会被隐藏,也就是说,只会访问到派生类的_num。派生类赋值给基类,就是将基类的部分依次赋值过去。

2023-06-23 19:03:10 252

原创 反向迭代器

原因在于Reverse_iterator的模板参数iterator也是模板,如果编译器允许去iterator中去找,找到的其实就是iterator中的T&和T*,但是iterator实例化后,T得到具体类型(假设是int),但是Reverse_iterator中的T并没有被实例化(对反向迭代器的适配支持中只传了iterator),还是虚拟的T类型。找到了也是虚拟类型。最开始*rit实际访问到的是6,++后指向6,实际访问到的是5,以此类推,当指向1时,访问完毕,rit和rend()相等。

2023-06-15 20:50:53 474

原创 deque(简单介绍一下)

如果将deque的数据拷贝进vector,进行排序,排序完再将数据拷贝给deque(用assign拷贝回deque),和直接对vector中的数据排序所花费的时间,进行比较,deque花费的时间大概是vector的1.4倍左右。1.中部插入删除效率不行,(要么需要挪动数据,要么支持每个开辟的空间大小不一定相同,这样的话,中控数组还要记录每个空间有多少个元素,因为要支持随机访问)对比两者的优缺点,发现他们的缺点正是为了他们的优点诞生的,两者不可分割。deque就是针对两者的缺点设计出来的,所以性能被牺牲了。

2023-06-06 18:05:16 493

原创 priority_queue的模拟实现和仿函数

这是一个函数,*和()相比,()优先级更高,函数名与()结合,为函数。sort的传参和优先级队列仿函数传参不同的是多了一个(),原因在于优先级队列传的是模板参数,这里传的是对象,优先级队列是在内部创建对象,sort是将创建好的对象传入sort使用。1.对函数指针解引用,找到对应函数,调用参数,和直接使用函数指针调用参数是一样的,即(*函数指针)(函数参数1.函数参数2)与函数指针(函数参数1,函数参数2)等价,代表函数指针可以直接使用()操作符,这样就能通过函数指针指向对应的比较函数,完成比较。

2023-06-06 18:04:42 405

原创 stack&queue

以1 + 2 * 3 / 4 - 5为例(最好通过画图辅助理解):遍历到1,存入后缀表达式,遍历到+,栈内为空,入栈,遍历到2,存入后缀表达式,遍历到*,和栈顶的+比较,入栈,遍历到3存入后缀表达式,遍历到/,和栈顶的*比较,*出栈,存入后缀表达式,/入栈,遍历到4存入后缀表达式,遍历到-,和栈顶的/比较,/出栈,存入后缀表达式,再和栈顶的+比较,+出栈,存入后缀表达式,此时栈内为空。-入栈,遍历到5,存入后缀表达式,遍历结束,栈内元素全部出栈。遍历结束,将栈内的运算符全部出栈,存入到后缀表达式中。

2023-05-29 21:18:14 518

原创 stack&queue的模拟实现

stack的代码少,原因在于采用了适配器模式,所谓适配器,以电器为例,每个电器都有电源适配器,中国的家用电源为220V的交流电,但是几乎没有电器需要220V的交流电,所以每个电器都有一个电源适配器,将家庭电压转换为自己需要的电压。简单的来说,deque是一个双端队列,虽然是队列,但并不是先进先出,而且deque支持随机访问,头插,头删,尾插,尾删,就机制而言,集合了list和vector的优点,但不代表能代替list和vector,因为在效率方面不如list和vector。这些也是queue的全部代码。

2023-05-29 21:17:20 511

原创 list的模拟实现

/it调用operator->()返回&(_node->date),即AA*,it->a1即AA* a1,实际上编译器为了可读性对这里进行简化。//这里的it是迭代器,解引用后拿到的是_date,_date的类型是T,即AA。//关于为什么const迭代器中T的前面不用加const:加上const,迭代器中的T就表示const T,_list_node就表示。//it调用operator*(),*it会拿到其中的数据,即拿到_next->date,为operator*()的返回值;

2023-05-26 10:20:33 904

原创 list的基本介绍

以及vector插入数据会扩容,影响运行效率(vector不断扩容销毁算比较大的),list每一份空间都是按需申请,释放,不会因为扩容影响运行效率。也可以说list的迭代器是双向迭代器,而算法中sort的迭代器需要随机迭代器。InputIterator:代表只写迭代器,可以传单向,双向,随机迭代器中的任意一种,这三种都支持写。还有一个splice函数,这是一个接合函数,将一个链表中的数据转移,插入到另一个链表中去。如果有大量数据需要排序的情况,不推荐使用list,因为list的sort效率不高。

2023-05-26 10:20:03 1128

原创 vector模拟

/void reserve(size_t n)(push_back满时调用)-> memcpy(tmp, _start, size() * sizeof(T));//段错误的成因:数据:1,2,3,4 第一次找到2,删除,数据变成1,3,4 it指向3,++后指向4,4为偶数,删除,数据变成1,3。//另一种是迭代器指向的意义发生变化,比如1,2,3,4,5,迭代器指向2,在2之前插入20,变成1,20,3,4,5,此时。//缩容方案在:size() < capacity()/2 时可以考虑。

2023-05-22 23:08:31 390

原创 vector的介绍

就像数组一样,vector对其元素使用连续的存储位置,这意味着也可以使用指向其元素的常规指针上的偏移量来访问它们的元素,并且与在数组中一样有效。这次的构造函数和string相比有一点不同,出现了很多没见过的类型表示方法,这些类型是由已知的类型typedef出来的,可以从Member functions上面的表格中找到对应的类型。vector和string也是存在区别的,比如一些函数接口的不同,如:vector是没有append函数的,也没有+=重载,所以储存字符串数据用string比较好。

2023-05-22 23:02:54 1072

原创 string的模拟实现

这样写的好处是,如果要存储小数组,就可以直接放到_buf[16]中去,就不用去对上申请了,如果字符串长度超过15,就放到_ptr指向的空间中去。// //有了get函数,就可以从缓冲区里识别空格符和换行符,比如输入hello world,hello被存入了string s中。// //就会出现要输入字符的字符串自动为空的情况,如果换一种空格不停止的停止条件,空格就是可以显示的。= &s)//如果不考虑if中的情况,在自己给自己赋值的情况下,就会丢失数据。

2023-05-07 19:30:48 434

原创 string的介绍

因为string是char实例化出来的,能很好的对应英文,但是gbk中的字符,也就是汉字,需要两个字节,一个字符不在对应一个char,所以设计出新的的类型char16_t(对应utf16),wchar_t(对应gbk),模板是为了应用到不同的场景(即存在不同的编码)中,比如在char16_t中一个字符就不是一个字节了。互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及。因为s1,s2分别指向一个空间,所以第一个swap的交换,改变的是指向空间的方向,第二个swap的交换是深拷贝交换。

2023-05-06 20:23:49 568

原创 开发工具——gdb

开发工具gdbgdb在Linux下负责程序的调试。gdb相较于vs2019的调试,是不方便的。图形化界面调试确实是一种进步的现象。先编写一个简单的程序,如果不支持在for循环中定义变量,要在编译指令后面加上-std=c99选项。要编译的文件和要生成的文件位置要正确,位置反了的话源代码就没了。用gdb调试只需要在当前路径下输入gdb指令,后面跟上要调试的可执行文件。不是源代码文本文件,是可执行文件。但是发现no debugging symbols found,也就是说默认生成的可执行文件是不可调试的。quit

2022-12-03 17:45:12 986

原创 开发工具——gcc/g++

开发工具gcc/g++完成代码的编写完后,要形成可执行程序,需要编译工具进行对代码的编译。C语言的编译工具是gcc,c++的编译工具是g++。如果g++没有的话,可以切换到root执行命令yum install -y gcc-c++C语言和C++的编译:gcc只能编译C语言,而g++可以编译c++也可以编译C语言。在C语言的最后一章,已经学习了源代码到可执行程序的的简单步骤。下面来详细一点的说明。源代码,即程序,本质上是文本;可执行程序是机器语言,也就是二进制组成的。文本翻译成二进制要经过以下几个步骤

2022-12-03 17:44:40 1477 1

原创 开发工具vim

在Windows下,只能把错误的部分删掉,重新输入正确的。注释多行:首先将光标移动到要注释行的行首,然后Ctrl + v,进入V-BLOCK模式,然后通过j,k上下移动选择要注释的行,然后shift + i,进入INSERT模式,输入//后,按esc键进入命令行模式,之前通过上下移动的选定的代码就注释完毕了。如果需要将光标所在字符替换,除了删除重输,还可以按r,然后输入要替换的字符,如果需要替换多个,就输入数字n + r,然后输入要替换的字符,光标所在位置及后面n-1个字符就都替换成输入的字符了。

2022-11-26 17:11:27 1295

原创 Linux-yum

在应用市场客户端输入:抖音,应用市场APP的公司服务器收到请求,找到APP的内容,返回给手机,手机拿到安装包进行安装。1.yum源中的链接不一定都是国内的,在下载软件的时候,如果出现下载失败,或者链接访问超时。yum中可以下载的软件存放在不同的服务器上(可能是因为软件的提供方有很多),那么yum是怎么知道要去哪个服务器上下载对应的软件的安装包?概况的说,就是yum通过yum源,即框出的部分,找到对应的服务器,再到对应服务器上下载安装包给Linux系统。yum在什么地方搜索是在图示框出的配置文件中写好的。

2022-11-26 17:10:35 713

原创 Linux权限

虽然这么说了,但是又有一个很矛盾的点:文件是通过路径访问的,要使用路径,目录就必须具有读取文件的权限,因为要找到文件是要读取目录文件的内容的,而只记住文件名是没什么用,文件是有文件编号的,要找到一个文件的内容,通常是通过文件名找到对应的文件编号来完成操作的,这些都需要目录的读权限。在这个目录下,文件的拥有者可以对文件的权限进行修改,也就是说,如果不想让其他人看见和修改文件内容,可以把权限改成660,但是每个人都有all目录的写权限,也就是说,别人虽然读不了文件,但是可以删除文件。然后输入要切换用户的密码。

2022-11-20 14:42:08 596

原创 Linux基本指令——综合操作

如果输入命令的前几个字母剩下的命令可能性只有一种,此时按tab就会自动补齐命令,如果剩下的命令不止一种,就会显示所有可能的命令。现在所有笔记本,电脑,都叫x86的,所谓x86是指基于因特尔x86的CPU。不管是桌面级的笔记本,台式机,还是企业级的服务器,使用的芯片都是因特尔的。-a或–all 详细输出所有信息,依次为内核名称,主机名,内核版本号,内核版本,硬件名,处理器类型,硬件平台类型,操作系统名称。全部的操作:Ctrl + r,输入while,Ctrl + c,Ctrl + r,Ctrl + c。

2022-11-20 14:41:23 1054

原创 Linux基本指令3——文件操作

因为软件不是只有一个文件,其中有:可执行程序,快捷方式,安装方式,卸载方式,配置文件,动态库,静态库等等。默认情况下,几乎所有的解压工具解压出来的文件,都会放到当前目录下。默认的zip指令,只压缩了目录。将原tar_package目录转移到上层目录后,解压test.zip,解压出的内容只有tar_package的目录,要想连同文件一并压缩,需要加上-r选项。所有互联网公司的后台都是Linux系统,开发人员开发的软件,将来都要部署在Linux系统上,所以所有软件都要打包压缩,上传Linux,进行安装部署。

2022-11-19 15:41:20 438

原创 Linux基本指令2——时间相关

Linux提供获取时间指令的意义:进入一些特别私密的机房服务器的时候,什么的都不允许带,无法掌握时间。时间和时间戳,将来会是日志的一部分。也可以自己写一个程序获得时间戳:建一个test.c文件,nano test.c。然后gcc编译test.c,执行生成的文件,就能获得时间戳。date 指定格式显示时间: date +%Y:%m:%d。除了-3,其余都不行。时间戳->时间:date -d@[时间戳]%X : 相当于 %H:%M:%S。%F : 相当于 %Y-%m-%d。时间->时间戳:date +%s。

2022-11-19 15:37:35 1372

原创 c++STL库

Alexander Stepanov、Meng Lee 在惠普实验室完成的原始版本,本着开源精神(开放源代码,Linux,git,mysql也是开源的)(与之相对的是闭源,iOS,Windows就是闭源,装Windows的费用被计算在了电脑的价格中),他们声明允许任何人任意。由P. J. Plauger开发,继承自HP版本,被Windows Visual C++采用,不能公开或修改,缺陷:可读性比较低,被微软的VS系列使用了,负责这个版本的维护和更新的就是微软工程师。算法:对数据处理的方式。

2022-11-18 14:53:30 1070

原创 Linux基本指令1

Linux有自己的路径分隔符: / ,和URL中的/是一样的,在访问网站时,这些网站是有自己的后端服务的,域名后面的就是这些后端服务对应的路径,其原理和Linux相同,或者说,后端服务器就是Linux操作系统。还有鼠标,显卡,显示器,网卡等设备都看做文件,这样的好处是可以以同样的方式看待这些设备(这些设备是外设,像内存,CPU这样的内设就不能当做文件来看待了)。命令行中的 | 称为管道,现实中管道通常用来传输石油,天然气,水等资源,而在计算机世界,唯一的资源就是数据,管道的作用就是传输数据资源。

2022-11-18 14:50:59 423

原创 Linux环境安装

除了使用root账户,还可以自己创建一个账户,使用命令行adduser 用户名 回车,然后passwd 用户名 回车 然后输入密码,回车,再确认密码,回车(密码不显示)购买云服务器的主要方式是腾讯云和华为云,目前我所接触到的是华为云友好一点(不排除腾讯云有更好的只是我没发现)。顺便说一下Linux的问题不同于数据结构,c++问题的形式有限,Linux的问题相当多,有不明白的直接搜索。用户名开始默认为root,IP地址在自己的云服务器上,可以通过控制台查看,用弹性公网的IP地址。

2022-11-18 14:50:11 636

原创 模板-进阶(没有什么内容,只是一个知识点)

在编译过程中template.s内容为空,因为根本不知道T是什么类型(在链接步骤之前,各个文件都是独立的),没法生成对应类型的函数;针对这个现象,一些使用模板的文件会把文件后缀名改为.hpp,意为.h和.cpp的结合,通常只表示模板。文件后缀名不改,还是.h效果是一样的,因为.h和.hpp文件都会被展开,只是.hpp更具有标识性。汇编(生成符号表):Test.o和template.o(或者:Test.obj和template.obj)//格式固定,这是对vector整体实例化,也可以对某个函数实例化。

2022-09-21 09:25:31 150

原创 模板-初阶

template//模板参数的缺省和一般函数一样,要从右往左缺省,因为函数实参是从左往右赋值的。//函数模板可以根据实参推演参数类型,类模板没办法推演,所以要指定存储类型。非要这么写的话,要指定T的具体类型:Add(a1,d1);//如果st1存储int类型的数据,st2存储double类型的数据要怎么改?或者主动转换(强转):Add(a1,(int)d1);根据实参类型决定形参类型的过程叫编译器的推演,推演后生成函数的过程叫模板的实例化。

2022-09-21 09:21:32 339

原创 动态内存管理

如果申请的是内置类型的空间,new和malloc,delete和free基本类似,不同的地方是:new/delete申请和释放的是单个元素的空间,new[]和delete[]申请的是连续空间,而且new在申请空间失败时会抛异常,malloc会返回NULL。6. 申请自定义类型对象时,malloc/free只会开辟空间,不会调用构造函数与析构函数,而new在申请空间后会调用构造函数完成对象的初始化,delete在释放空间前会调用析构函数完成空间中资源的清理。//new带[]出来的,delete也要加上[]。.

2022-08-12 20:50:02 359

原创 类和对象(3)

具体如何重载需要引入一个概念。已知:内置类型可以直接使用运算符,cout会自动识别内置类型。cout如何自动识别类型的?cout和cin具体又是什么?

2022-07-25 09:57:56 458

原创 日期类的实现

/下面这个是后置++,暂时不会写,后置++此时不能有缺省值,如果加上那么调用++重载函数,前置++后置++都是不需要参数的,使用++时编译器就会不知道调用哪一个了。特别声明这里的改进并不是自上而下的改进,而是边写边改进,所以整体的结构并不是很合理。声明和定义不能分离的是内联函数,类中函数的声明和定义可以分离,只是需要一定格式。//在获取月份天数哪里将0月的位置改为12月的天数,解决0月的问题。//在获取月份天数哪里将0月的位置改为12月的天数,解决0月的问题。//计算日期之间间隔的天数,暂时不会写。....

2022-07-24 11:26:17 211 2

原创 类和对象(2)(6个默认成员函数)

1.类的6个默认成员函数(友情提示:这部分相当恶心)如果一个类中什么成员都没有,简称为空类。空类中什么都没有吗?并不是的,任何一个类在我们不写的情况下,都会自动生成下面6个默认成员函数。2.构造函数C语言语法存在很多问题,比如忘记初始化(很普遍),在一些情况下会造成程序的崩溃。c++是针对C语言的改造升级,所以c++有构造函数来解决忘记初始化的问题。也就是说,之前日期类中Init函数其实没必要存在。构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,保证每个数据成员都有 一个合适

2022-07-23 19:05:03 319

原创 类和对象(1)

指针是对内存编号的结果,从0x00000000到0xFFFFFFFF,从小往大编,空指针就是第一个字节空间的地址,第一个字节空间通常会被预留出来,不存储数据,所以空指针是不可访问的。4.如果出现结构体嵌套结构体的情况,嵌套的结构体对齐到自己最大对齐数的整数倍处,结构体的整体大小就是所有对齐数中(包括嵌套结构体的对齐数)最大对齐数的整数倍。具体取决于栈的初始化。栈里面有三个成员,三个函数,按理解,函数应该会存函数指针,函数调用时,还要建立栈帧,函数在类的类域中,所以计算类的大小可能还要考虑函数栈帧的大小。..

2022-07-22 19:14:44 305

原创 auto(c++11)和nullptr(c++11)

C++11中,标准委员会赋予了auto全新的含义即auto不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得。int*//inta前加上const,打印出来的是intconst*,intconst*和constint*是等价的,不同的是int*const。c++11是继c++98后的下一个大版本,c++11在vs编译器中是vs2011以后的版本支持,以前的版本支持的不全。NULL和0的赋值方式,严格来讲是不规范的。......

2022-07-21 21:48:59 329

原创 c++内联函数

原因在于在f.h中只有函数的声明,没有函数的实现,所以在编译时,没有办法展开,只能通过连接来处理。inline终究是内联函数,不优化也保持了一定的内联函数性质,也就是说,debug版本下内联函数支持调试,但是符号表中没有内联函数的标识符,也就不支持定义和声明分开。概念以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数压栈的开销,内联函数提升程序运行的效率。当我们频繁调用短小函数时,就会使用内联函数。这就是内联函数的意义,解决宏函数机制复杂,容易写错的问题。.....

2022-07-21 21:48:22 2169

原创 c++引用

可以调试一下,b引用的是中间的临时变量,b的地址和a的地址是不一样的。原因在于返回的是c的引用,也就是说ret的值是add函数中c的那块空间所对应的值。如果constint&y=x前没有const,y引用x时,前面没有const,可以对x值进行修改,权限从只读到可修改可读取,权限放大,语法报错。而指针和引用是可以影响对象的。在书写上可以节省一点时间,在功能上产生优化(比如不需要对参数开辟空间了,以及其他的方面的优化,引用传参比普通传参的效率高很多很多,和指针传参的效率差不多,在其他方面比指针更优).....

2022-07-17 12:36:02 258

原创 c++函数重载

函数重载与C语言不同,c++的函数名是可以相同的,只要参数不同就可以。可以是类型,个数,顺序,只要一样不同就可以。顺序是指类型顺序。函数重载和返回值没有关系。因为调用的时候无法识别返回值。c++函数名可以相同的关键就在于函数重载。这个和之前命名空间防止命名冲突又不一样。下面讲一下c++是如何支持函数重载的。......

2022-07-13 22:19:06 741

空空如也

空空如也

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

TA关注的人

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