首页
学习
活动
专区
圈层
工具
发布

【C++掌中宝】深入理解函数重载:概念、规则与应用

重载函数的调用匹配规则 当调用重载函数时,编译器会按照以下顺序依次进行匹配: 精确匹配:参数类型与声明的函数完全一致,参数匹配而不做转换,或者只是做微不足道的转换,如数组名到指针、函数名到指向函数的指针...编译器如何解析重载函数的调用? 编译器实现调用重载函数解析机制的时候,肯定是首先找出同名的一些候选函数,然后从候选函数中找出最符合的,如果找不到就报错。...筛选可用函数:根据参数类型和数量,筛选出所有参数能够匹配的函数。 确定最佳匹配:根据函数匹配规则,选出优先级最高的匹配函数。 如果存在多个相同优先级的匹配,编译器会报出“模凌两可”错误。...避免歧义:当可能出现多个重载函数符合条件时,尽量避免定义过于模棱两可的函数,确保调用时能够明确匹配。 8....结语 今天的分享到这里就结束啦!如果觉得文章还不错的话,可以三连支持一下。 也可以点点关注,避免以后找不到我哦!

85810

【C++ 函数重载】—— 现代编译技术下的多态表达与性能优化

以下代码会导致编译错误: // 尝试通过返回类型区分函数,但这是不允许的 int func(int num) { return num; } // 编译错误:与上面的函数仅返回类型不同,不能构成重载...return 0; } 如果找不到最佳匹配的函数,或者有多个函数匹配程度相同(二义性),编译器会报错。...关键操作: 链接器通过修饰后的名称解析外部符号引用。 若找不到匹配的符号(如名称修饰不一致),引发链接错误。...在函数重载的场景下,符号表会存储每个重载函数的名称、参数类型、返回值类型、函数地址等信息。编译器在编译过程中通过符号表来查找和管理函数,在函数匹配时,会从符号表中获取候选函数的信息进行匹配。...编译和链接:编译阶段,编译器根据名称修饰和函数匹配规则处理函数调用并生成机器代码,同时在目标文件记录函数符号信息;链接阶段,链接器根据修饰后的函数名关联函数调用和定义,若找不到函数定义则报错。

59710
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    c++标准头文件的结构

    这样,模块B中调用模块A中的函数时,在编译阶段,模块B虽然找不到该函数,但是并不会报错;它会在连接阶段中从模块A编译生成的目标代码中找到此函数。    ...其次,被它修饰的目标是“C”的,意思是其修饰的变量和函数是按照C语言方式编译和连接的。我们来看看C++中对类似C的函数是怎样编译的。...作为一种面向对象的语言, C++支持函数重载,而过程式语言 C 则不支持。函数被 C++编译后在符号库中的名字与 C语言的不同。...可以发现,这样的名字包含了函数名、函数参数数量及类型信息,C++就是靠这种机制来实现函数重载的。这样,如果在C中连接C++编译的符号时,就会因找不到符号问题发生连接错误。    ...因此extern “C”是C++编译器提供的与C 连接交换指定的符号,用来解决名字匹配问题。

    1.2K20

    C++打怪升级(八)- 泛型编程初见

    -- 如果模板可以产生一个具有更好匹配的函数, 编译器将会选择模板实例化出的函数; **也就是说,编译器选择优先考虑是匹配问题; ** int Add(const int& t1, const int...链接错误 test.o文件找不到要调用的由类模板实例化的成员函数,那么为什么找不到呢?...这牵扯到了多个源文件的编译链接过程 链接错误,说明不是语法问题,而是链接时,test.o在class.o中找不到要调用的类模板实例化出来的函数,即类模板没有实例化处具体的函数,class.o符号表中也就没有相应函数的地址...,而函数的声明没有实际有效地址,故test.o会在链接期间到class.o中寻找函数有效地址(类函数实例化后才有); 但class.o符号表中是没有具体函数的地址的,结果是test.o哪里都找不到待调用函数有效地址...,而这又发生在链接阶段,导致链接错误; 解决方法 在函数定义文件中主动显式实例化 这是一个不太好(实用)的方法 既然链接错误是因为,类模板成员函数只有声明显式实例化了,那么我们也在类模板成员函数定义文件内显式实例化即可

    1.1K20

    掌握C++ STL容器搜索技巧:实现高效和准确的数据访问

    对于所有组,4个重载的形式为:搜索由std::string给出的字符串。搜索由char*和size给出的字符串。搜索由char*给出的字符串(止于null字符)。搜索一个字符。...并且所有4个重载都以搜索字符串中的起始位置作为参数,默认值为0(从字符串的开头开始搜索)。以下是6组方法:find函数:用于从字符串中查找给定子字符串str的第一个匹配项。...size_tfind(conststd::string&str,size_tpos=0)const;rfind函数:与find函数类似,但它从字符串的末尾开始向前搜索子字符串str的最后一个匹配项。...size_trfind(conststd::string&str,size_tpos=npos)const;find_first_of函数:用于从字符串中查找与给定字符串str中的任何字符匹配的第一个字符...str中的任何字符匹配的最后一个字符。

    17110

    c++之重载函数学习总结

    一、C++中的函数重载: 1、函数重载的概念: 用同一个函数名定义不同的函数 当函数名和不同的参数搭配时函数的含义不同 注意:在c语言中是没有函数重载这个概念的。...4、C++编译器调用重载函数的准则: 将所有同名函数作为候选者 尝试寻找可行的候选函数: 精确匹配实参 通过默认参数能够匹配实参 通过默认类型转换匹配实参 匹配失败:...最终寻找到的候选函数不唯一,则出现二义性,编译失败 无法匹配所有候选者,函数未定义编译失败 5、函数重载的注意事项: 重载函数在本质上是相互独立的不同函数 重载函数的函数类型不同 函数返回值不能作为函数重载的依据...函数重载遇上函数指针: 将函数名赋值给函数指针时 根据重载规则跳线与函数指针参数列表一致的候选者 严格匹配候选者的函数类型与函数指针的函数类型 代码试验: #include #...,如果文章中有错误或者不理解的地方,可以交流互动,一起进步。

    54750

    【C++】基础知识讲解(命名空间、缺省参数、重载、输入输出)

    前言 命名空间 如上图,当我们没包stdlib.h的头文件时,可以正常打印。但如果包了该头文件,就会发生错误。 上面的错误称为命名冲突。...命名空间的定义 当有两个同名变量时,会优先在找局部的,如果找不到,再找全局的。如果我们想打印1,就可以加上 ‘::’ 前面不加域的情况下,默认是空,也就是全局域,该符号叫域作用限定符。...半缺省参数 分析: 半缺省参数必须从右往左依次来给出,不能间隔着给,因为实参是从左往右匹配的。 上图是错误的例子。...C语言不允许同名函数 CPP语言允许同名函数,要求:函数名相同,参数不同(例如:类型、顺序、个数不同),构成函数重载。 下面举例类型不同: C语言不支持重载。...注意:如果两个函数函数名和参数是一样的,返回值不同是不构成重载的,因为调用时编译器没办 法区分。

    45010

    java — 重载和覆盖

    重载(overload):对于类的方法,方法名相同,参数列表不同的方法之间构成了重载关系。  参数列表:参数的类型、参数的个数、参数的顺序。   子类从父类继承来的方法也可以发生重载。   ...如果多个方法有相同的名字、不同的参数,便产生了重载。编译器必须挑选出具体执行哪个方法,通过各个方法给出的参数类型与特定的方法调用所使用的值类型进行匹配来挑选出相应的方法。   ...如果找不到匹配的参数,或者有多个可能的匹配,就会产生编译时错误。 重载关系只能发生在同一个类中吗?不是的。   ...,那么会发生编译错误。...反之亦然,即使父类和子类中的方法都是static类型的,并且满足覆盖条件,但是仍然不会发生覆盖,因为static是在编译的时候将静态方法和类的引用类型进行匹配。

    1.1K70

    【带着canvas去流浪(11)】Three.js入门学习笔记

    Three.js中的基本概念 官方文档中的新手示例过于简单,所以本节对Three.js中的概念进行一些补充描述: 客观三要素:场景Scene,相机Camera,渲染器Renderer 具体用法可以看官方文档的...THREE.js中内置了包含立方体,球体,多面体数十种常见的几何体,也可以将canvas绘制的平面图形拉伸成为实体。...THREE.LatheGeometry相当于三维建模软件中的“根据样条曲线生成回转体”,构造函数的参数中没有回转轴,此处官方文档中有说明:车削是绕着Y轴来进行旋转的。...,需要正确调整其参数才能够显示阴影,参数配置错误时可能会显示一半阴影或者马赛克黑区: //初始化灯光 function initLight(color) { //添加环境光 ambientLight...第46节-关于将svg拉伸为实体 原文中提到的transformSVGPathExposed函数和官方代码仓lib里的脚本已经找不到了,新版的官方文档中已经听过了SVGLoader来完成svg到shape

    4.3K11

    【笔记】《C++Primer》—— 第6章:函数

    void类型的函数会自动在函数尾隐含补上return,但若不是void型,则要保证每条路径都要有返回值,很多编译器无法发现越过循环的return缺失(vs可以发现这个错误并以警告方式提示) ?...const和非const直接存在一次类型转换,当参数出现多个匹配时,会按照匹配优先级进行选择 前面出现过的const_cast类型转换在重载中非常有效,主要用于先将函数主干用const写完,然后重载一个普通版本的函数...6.6 函数匹配 第四节中说到的重载函数的判定问题,具体来说就是函数匹配问题,分为候选函数算则,可行函数选择和寻找最佳匹配三步 首先在所有函数中找到同名且可调用的函数,称为候选函数 然后在候选函数中选出符合目前提供的实参的函数...,成为可行函数 可行函数需形参数量与实参相等(可利用默认实参)且类型符合(可转换来适应) 最后若有多个可行函数,则需要进行最佳匹配寻找,若找不到最佳匹配则报错“存在二义性” 最佳匹配实际上就是要找出有唯一一个函数...使用函数指针时,可以直接用名称使用,可以不需要解引用符,赋值函数指针也可以不需要对目标函数用取地址符 使用重载函数指针必须保证函数指针与目标重载函数精确匹配 函数指针的好处就是可以将函数作为形参来传入也可以作为返回值返回了

    1K30

    C++ 模板初阶:从函数重载到泛型编程的优雅过渡

    ,所有重载函数都要改,漏改一个就会出 bug(一个出错可能所有的重载均出错) 这时我们会想:能不能给编译器一个 “模具”,让它根据不同类型自动生成对应的代码?...x,const T2& y) { } 5.模板参数的匹配原则 当 “非模板函数” 和 “同名的函数模板” 同时存在时,编译器会怎么选择?...(完全匹配,不用实例化模板) Add(1, 2); // 调用模板实例化的Add(int, int)(手动指定类型) } 原则 2:优先调用非模板函数,除非模板匹配更好 如果非模板函数不完全匹配...Add(1, 2.5); // 模板能生成Add(int, double),匹配更好,调用模板 } 原则 3:模板不支持自动类型转换,普通函数支持 函数模板的参数类型必须严格匹配...原因是: 1.编译.cpp文件时,编译器不知道用户会用什么类型实例化模板,所以不会生成具体的成员函数实现 2.编译使用模板的文件(比如main.cpp)时,包含.h文件只能看到类声明,链接时找不到成员函数的具体实现

    22110

    【C++模板与泛型编程】重载与函数模板

    当两者结合时,即函数模板重载(Function Template Overloading),会带来更灵活的代码设计,但也伴随着复杂的匹配规则。 一、函数重载基础 1.1 什么是函数重载?... void func(T* a) {} // 新的函数模板,构成重载 四、函数匹配与模板实例化 4.1 重载解析的三个步骤 当调用一个重载函数或函数模板时,编译器按以下步骤确定最佳匹配...: 确定候选函数集:包括所有可见的同名函数和函数模板实例 确定可行函数:从候选函数中筛选出参数数量和类型可转换的函数 选择最佳匹配:按以下优先级排序: 精确匹配(无转换或仅 trivial...(精确匹配) print(42); // 调用模板函数(实例化为print) return 0; } 5.2 函数模板之间的竞争 当多个函数模板都能匹配时,编译器选择更特化的模板...理解函数匹配规则和模板实例化过程是掌握这一技术的关键: 函数重载:通过参数列表的不同区分同名函数 函数模板:实现代码的泛型化,通过模板参数推导实例化 模板重载:多个同名模板通过参数列表区分 重载解析:编译器按优先级选择最佳匹配函数

    16610

    JSAPIThree 加载单体三维模型学习笔记:SimpleModel 简易加载方式

    了解 SimpleModelSimpleModel 是 mapvthree 对 Three.js 模型加载的封装,主要解决了以下问题:原生 Three.js 加载方式的问题如果直接使用 Three.js...我的理解:如果需要在加载完成后进行操作(如修改材质、添加动画),一定要使用 loaded 事件不要在构造函数返回后立即操作模型,因为此时模型可能还没加载完成第五步:动态更新模型变换使用 setTransform...第九步:踩过的坑作为一个初学者,我踩了不少坑,记录下来避免再犯:坑 1:模型不显示原因:模型路径错误,或者模型文件格式不支持。...解决:检查模型文件路径是否正确确认模型文件格式是否为 glb/gltf(或其他 Three.js 支持的格式)打开浏览器控制台查看是否有加载错误检查模型位置是否在视野范围内坑 2:模型方向不对原因:坐标系转换问题...解决:尝试修改 autoYUpToZUp 参数(true/false)调整 rotation 参数,尝试不同的旋转角度在建模软件中检查模型的坐标系和方向坑 3:模型太大或太小原因:模型原始尺寸与场景比例不匹配

    13410

    深入理解C++模板编程:从基础到进阶

    可维护性差:如果交换逻辑出现错误,可能影响所有重载的函数。 模板让我们可以编写一个适用于多种类型的通用交换函数,从而解决这些问题。...以下是模板参数匹配的原则: 1.非模板函数优先于同名的模板函数: 当存在一个非模板函数和一个同名的函数模板,编译器优先选择调用与实参类型完全匹配的非模板函数,而不是实例化模板函数。...2.优先选择模板版本进行更好匹配: 当非模板函数和模板函数都能适配参数类型,但模板版本提供了更精确的匹配,编译器会选择模板版本。...否则,在链接时可能找不到模板的定义,从而导致链接错误。...,避免了在不同编译单元中找不到模板定义的问题。

    49411

    【C++学习】模板初阶&&STL简介

    ,但是有一下几个不好的地方: 1、重载的函数仅仅是类型不同,代码复用率比较低,只要有新类型出现时,就需要用户自己增加对应的函数。...2、模版的定义和声明不支持分别在两个文件里面【会出现链接错误,所有的链接错误都是符号表找不到】因为编译器的模版T是无法确定的,无法生成符号表。...显式实例化:在函数名后的中指定模板参数的实际类型 在上面的函数中加上下面的代码即可: 如果类型不匹配,编译器会尝试进行隐式类型转换,如果无法转换成功编译器将会报错 2.5 函数模版的匹配原则 1、一个非模板函数...如果模板可以产生一个具有更好匹配的函数, 那么将选择模板。...1, 2.0); // 模板函数可以生成更加匹配的版本,编译器根据实参生成更加匹配的Add函数 return 0; } 3、模板函数不允许自动类型转换,但普通函数可以进行自动类型转换。

    31810

    从Java继承类的重名static函数浅谈解析调用与分派

    今天被实习生问了这么个问题: 在java中,static成员函数是否可以被重写呢? 结论是,你可以在子类中重写一个static函数,但是这个函数并不能像正常的非static函数那样运行。...(实际上该实例是一个子类)调用static函数时,调用的是父类的static函数。...如果不是,才会去进行其它操作(例如动态方法查询) 可能有的人一拍大腿,这不就是java的静态/动态分派么! 有点像,但还真不是,静态分派与动态分派是用来确定重载和重写逻辑的。...在重载过程中,编译器根据方法参数的静态类型(比如tc1的静态类型是class1,tc2的是class2,但本文这里不是重载!)来确定使用方法的版本,这叫做静态分派。...这里的原因在于,动态分派时,我们实际是在讨论Java的invokevirtual指令的行为:这个指令首先会去寻找调用者的运行时类型,然后在其方法表里面寻找匹配的方法,如果找不到,再从其父类里找。

    1.8K30

    【C++高级主题】命令空间(六):重载与命名空间

    一、候选函数与命名空间:重载的 “搜索范围” 1.1 重载集的构成规则 函数重载的核心是重载集(Overload Set):编译器在调用函数时,会收集所有可能的候选函数,最终选择最匹配的一个。...调用时根据参数列表选择最匹配的函数。 2.2 using声明的冲突处理 若using声明引入的函数与当前作用域的函数参数列表完全相同,会导致编译错误(重载要求参数列表不同)。...:歧义调用(参数列表完全相同) return 0; } using声明引入的函数与当前作用域的函数参数列表完全相同时,无法形成重载,调用时会报二义性错误。...调用时根据参数类型选择匹配的函数。 3.2 using指示的二义性风险 若多个命名空间中存在同名且参数列表相同的函数,using指示会导致重载集包含多个候选函数,调用时可能因二义性报错。...调用print(string)时,普通函数的匹配优先级高于模板函数(精确匹配)。

    13210
    领券