首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

是什么让一个重载函数优先于另一个重载函数?

重载函数是指在同一个作用域内,函数名相同但参数列表不同的多个函数。当调用一个重载函数时,编译器会根据传入的参数类型和数量来确定应该调用哪个重载函数。

在确定哪个重载函数优先调用时,编译器会按照以下规则进行匹配:

  1. 精确匹配:如果有一个重载函数的参数类型与传入参数的类型完全匹配,则选择该重载函数。例如,如果有一个重载函数的参数为int类型,而传入的参数也是int类型,则选择该重载函数。
  2. 类型提升:如果没有找到精确匹配的重载函数,编译器会尝试将传入参数的类型提升为其他类型,然后再进行匹配。例如,如果有一个重载函数的参数为float类型,而传入的参数为int类型,则编译器会将int类型提升为float类型,然后选择该重载函数。
  3. 标准类型转换:如果没有找到精确匹配或类型提升的重载函数,编译器会尝试进行标准类型转换,将传入参数的类型转换为重载函数参数类型。例如,如果有一个重载函数的参数为double类型,而传入的参数为int类型,则编译器会将int类型转换为double类型,然后选择该重载函数。
  4. 用户自定义类型转换:如果没有找到以上匹配方式的重载函数,编译器会尝试进行用户自定义类型转换。用户可以通过定义类型转换函数或者类型转换构造函数来实现自定义类型转换。例如,如果有一个重载函数的参数为自定义类型A,而传入的参数为自定义类型B,而类型B可以通过类型转换函数或者类型转换构造函数转换为类型A,则选择该重载函数。

总结起来,重载函数的优先级是根据参数类型的匹配程度来确定的,精确匹配优先于类型提升,类型提升优先于标准类型转换,标准类型转换优先于用户自定义类型转换。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

TypeScript: 通过一个小案例了解 ts 函数重载和类型保护

一个小需求 我们想做一个这样的函数 参数 number 默认值为 1 number 只能输入 1,2,3 三种类型 1、开始筹划 code // 声明一个 number 的特殊类型,限制参数 type...我们用竖线(|)分隔每个类型,所以number | string | boolean表示一个值可以是number,string,或boolean。 2、使用函数重载 function test(a?...所谓函数重载就是同一个函数,根据传递的参数不同,会有不同的表现形式。...(由于 JavaScript 没有函数重载) 函数实现签名,它并不是重载的一部分: function createLog(message: string): number; function...createLog('source', 'message'); // ERROR: Supplied parameters do not match any signature 复制代码 当至少具有一个函数重载的签名时

1.2K30

【C++】泛型编程 ⑨ ( 类模板的运算符重载 - 函数声明 和 函数实现 写在同一个类中 | 类模板 的 外部友元函数问题 )

类模板 的 函数声明 与 函数实现 都写在同一个类中 ; 类模板 的 函数实现 在 类外部进行 , 写在相同的 .h 和 .cpp 源码文件中 ; 类模板 的 函数实现 在 类外部进行 , 写在不同的...写在同一个类中 下面的类是一个 普通类 , 其中定义了 成员变量 和 成员方法 ; 并为其重载了 左移运算符 和 加法运算符 ; 其中 加法运算符 重载 是在 类内部实现的 , 左移运算符 重载 是在类外部...三、类模板的运算符重载 - 函数声明 和 函数实现 写在同一个类中 1、类模板 的 外部友元函数问题 将上述 " 普通类的运算符重载 - 函数声明 和 函数实现 写在同一个类中 " 示例改造成 类模板...template 就是重新定义了一个新的泛型 , 与 类模板 中的 T 不是同一个泛型类型 ; 解决上述问题 , 就需要将 友元函数 定义在 类模板 的内部 ; template...out << "a:" << s.a << " b: " << s.b << endl; return out; } } 2、代码示例 - 类模板 函数声明 和 函数实现 写在同一个类中 ( 包括友元函数

25810
  • 函数模板 ## 函数模板

    方法:对于给定的函数名,可以有⾮模板函数、模板函数和显式具体化模板函数以及它们的重载版本。...显式实例化语法: templat void Swap(int ,int);在同一个文件中使用同一种类型的显式实例和显式具体化将出错。隐式实例化、显式实例化和显式具体化统称为具体化。...编译器选择使用哪个函数版本对于函数重载函数模板和函数模板重载,C++需要(且有)⼀个 定义良好的策略,来决定为函数调⽤使⽤哪⼀个函数定义,尤其是有多 个参数时。...编译器必须确定哪个可⾏函数是最佳的。它查看为使函数调⽤参数与可⾏的候选函数的参数匹配所需要进⾏的转换。通常,从最 佳到最差的顺序如下所述。完全匹配,但常规函数先于模板。...在这种情况下,⾮模板函数将优先于模板函数(包 括显式具体化)。 - 如果两个完全匹配的函数都是模板函数,则较具体的模板函数 先。

    2.2K10

    Java面试集合(五)

    那么我们就可以把这些相同的属性和方法提取到一个新的类中,用继承的方法,一个类继承另一个类,那么这个类就具有它的属性和方法了。...在现实世界当中,继承就是儿子得到老子的东西,在面向对象的世界当中,继承就是一个类得到了另一个类当中的成员变量和成员方法 在Java中的继承,其实就是继承全部属性和方法(除了构造方法),除了private...方法的重写,重载 重载的表达 class A{ void funA(){ System.out.println("没有参数的funA函数"); } void funA(int i){ System.out.println...) 具有父子关系的两个类中,父类和子类各有一个函数,这两个函数的定义(返回值类型,函数名,参数列表)完全相同 重写和重载 重载: 方法名一样,但是参数类型不一样(不同的参数个数,不同的参数类型,...在初始化代码块/构造代码块中,优先于构造方法执行。 局部代码块,用于限制变量的生命周期和提高栈内存的利用。

    38230

    【C++】泛型编程 ⑩ ( 类模板的运算符重载 - 函数实现 写在类外部的同一个 cpp 代码中 | 类模板 的 外部友元函数二次编译问题 )

    将 类模板 函数声明 与 函数实现 分开进行编码 , 有 三种 方式 : 类模板 的 函数声明 与 函数实现 都写在同一个类中 , 也就是没有分开进行编码 ; 类模板 的 函数实现 在 类外部进行 ,...( 类模板的运算符重载 - 函数声明 和 函数实现 写在同一个类中 | 类模板 的 外部友元函数问题 ) 实现了第一种情况 , 类模板 的 函数声明 与 函数实现 都写在同一个类中 , 也就是没有分开进行编码...友元函数 不是 类中的函数 , 是 类外部的函数 , 友元函数 中又用到了 泛型 T , 说明这是一个 模板函数 ; 友元函数 是 全局函数 , 不属于 类模板 , 不要使用 域操作符 访问友元函数...时 , 只进行 简单的 语法分析 , 词法分析 , 生成一个函数头 ; 第二次编译 函数模板 时 , 又生成一个 函数头 ; 这两次编译生成的 函数头 不一致 , 导致 无法找到 相应的 函数实现 ;...( 2 ) 正确写法 友元函数 不要乱用 , 只有在 重载 左移 右移 操作符时 , 才使用 友元函数 ; 这是 函数模板 二次编译 问题 , 一般情况下 , 函数模板 只有在 调用时 , 才需要将

    21210

    JAVA重写和重载的区别

    问:下面程序的运行结果是什么,为什么? 问: Java 重载与重写是什么?有什么区别? ...答:   重载(Overload)是类以统一的方式处理不同类型数据的一种手段,实质表现就是多个具有不同的参数个数或者类型的同名函数(返回值类型可随意,不能以返回类型作为重载函数的区分标准)同时存在于同一个类中...Android类中的一个重载例子  重写(Override)是父类与子类之间的多态性,实质是对父类的函数进行重新定义,如果在子类中定义某方法与其父类有相同的名称和参数则该方法被重写,不过子类函数的访问修饰权限不能小于父类的...而重载是针对同一个的,所以构造方法可以被重载。  问:下面程序的运行结果是什么,为什么? ...Demo 类型而另一个是 Object 类型,因此这两个方法是重载关系(发生在编译时)而不是重写关系;故当调用 o1.equals(o2) 时,o2 是 Object 类型参数,实际上调用了 Object

    64930

    JAVA重写和重载的区别「建议收藏」

    问: Java 重载与重写是什么?有什么区别?...答: 重载(Overload)是类以统一的方式处理不同类型数据的一种手段,实质表现就是多个具有不同的参数个数或者类型的同名函数(返回值类型可随意,不能以返回类型作为重载函数的区分标准)同时存在于同一个类中...Android类中的一个重载例子 重写(Override)是父类与子类之间的多态性,实质是对父类的函数进行重新定义,如果在子类中定义某方法与其父类有相同的名称和参数则该方法被重写,不过子类函数的访问修饰权限不能小于父类的...而重载是针对同一个的,所以构造方法可以被重载。 问:下面程序的运行结果是什么,为什么?...Demo 类型而另一个是 Object 类型,因此这两个方法是重载关系(发生在编译时)而不是重写关系;故当调用 o1.equals(o2) 时,o2 是 Object 类型参数,实际上调用了 Object

    47030

    Java编程思想学习录(连载之:初始化与清理)

    = 自己未写编译器帮忙自动创建的 若自行定义了构造器(无论参数有否),编译器便停止默认创建动作 类里的对象引用默认初始化为null,基本类型初始化为0 四种常见初始化方式: 自动初始化:无法被阻止的,先于构造器...且一定先于构造器执行) 构造器初始化:在构造器中对成员赋上值 静态域的初始化: java中的static关键字是只能用于域,而不能用于普通的局部变量 未赋值过的类的静态域默认有初值:(object=null...可变参数列表 特别注意: 若函数参数只使用可变函数列表这将会使重载变得难以理解,解决办法是:(1)要么在参数中加一个非可变参数;(2)要么只在重载方法的一个版本上使用可变参数;(3)不要尝试这种做法 初始化的顺序...this,且static方法内部不可调用非static方法,反过来ok this可以用来在constructor中调用constructor,举例: ---- 关于重载 java重载唯一规则:独一无二的参数列表...垃圾回收只与内存有关 java允许在类中创建一个名为finalize()的方法做终结处理,但该函数一般不是来给你做内存释放这类动作的!

    57780

    CC++开发基础——函数模板

    当编译器遇到一个函数模板的定义时,并不会马上生成相关代码,只有当我们将函数模板实例化成一个函数定义时,编译器才会生成代码。...为了编译器为实例化后的函数模板生成代码,编译器需要同时知道函数模板的声明和定义,因此函数模板的定义也需要放在头文件中。...代码样例: template inline T min(const T&, const T&); 9.函数模板的重载 函数模板的重载有两种方式: 方式1.用同名函数重载函数模板...方式2.用另一个函数模板重载已有模板 重载的代码样例: template T larger(const T data[], size_t count) { T result...,函数模板,函数模板的特例时,普通函数的调用优先于函数模板特例,函数模板特例的调用优先于原始函数模板。

    15021

    一个经典例子你彻彻底底理解java回调机制是什么_java实现回调函数

    这个方法就叫回调方法,这样子说你是不是有点晕晕的,其实我刚开始也是这样不理解,看了人家说比较经典的回调方式: Class A实现接口CallBack callback——背景1 class A中包含一个...,小李打了小王的电话,告诉他答案是2 /** * 这是一个回调接口 * @author xiaanming * */ public interface CallBack { /** * 这个是小李知道答案时要调用的函数告诉小王...,也就是回调函数 * @param result 是答案 */ public void solve(String result); } Jetbrains全家桶1年46,售后保障稳定 /...onclick()是一个回调方法,当用户点击View就执行这个方法,我们用Button来举例好了 //这个是View的一个回调接口 /** * Interface definition for a callback...extends View----->A类调用B类的某个方法 C */ button.setOnClickListener(this); } /** * 用户点击Button时调用的回调函数

    35020

    C++函数

    引 关于C++的函数有很多知识,因为其函数有多种变体,可以说C++创作者为了开发方便,打开了很多个后门编程人员随心所欲地炫技使用,但私以为这也造成了使用函数时的复杂度,如果真的在代码中使用各种变体,虽然确实可以代码看上去简洁高级...参数传递方式 参数传递方式是什么意思?这里我们指的是传递的到底是变量的拷贝还是变量本身。...注意,这和上面的函数重载是有区别的,实际上也是进一步节省了函数重载的工作,不用定义那么多相同名字参数不同的函数,写那么多代码,只写一个就行了,参数类型根据传递进来的而定,即参数可配置: // 函数原型...显示具体化 上面的函数模板所有的参数类型使用同一个函数代码块执行同一种操作,如果我这时候又想对某个特定类型做不同的操作怎么办?就你名堂多。 一种方法是使用函数重载。...从最佳匹配到最差匹配顺序如下: 完全匹配,但常规函数先于模板。 提升转换(需要转换参数类型,如char和shorts自动转换为int,float自动转换为double)。

    32710

    Python 3 之 运算符重载详解

    以下是对重载的关键概念的复习: 运算符重载类拦截常规的Python运算。 类可重载所有Python表达式运算符 类可以重载打印、函数调用、属性点号运算等内置运算 重载使类实例的行为像内置类型。...构造函数和表达式:__init__ 和 __sub__ 让我们来看一下一个简单的重载例子吧。...要支持更加特定的成员关系,类可能编写一个__contains__方法……当出现的时候,该方法优先于__iter__方法,__iter__方法优先于__getitem__方法。...在类的高级主题你会看到另一个__call__例子,我们会通过它来实现所谓的函数装饰器的概念:它是可调用对象,在嵌入的函数上多加一层逻辑。...因为__call__可让我们把状态信息附加在可调用对象上,所以自然而然地成为了被一个函数记住并调用了另一个函数的实现技术。

    4.1K10

    C++运算符重载(四)之赋值运算符重载

    赋值运算符重载 c++编译器至少给一个类添加4个函数 默认构造函数(无参,函数体为空) 默认析构函数(无参,函数体为空) 默认拷贝构造函数,对属性进行值拷贝 赋值运算符 operator=, 对属性进行值拷贝...== 函数名:operator加上运算符 参数:有几个操作数就有几个参数,参数类型就是要操作对象的类型 返回值:看运算符运算后的返回值是什么 //存在this指针,要少传一个参数 bool operator..._day; } 公有函数无法访问私有变量,所以运算符重载要写在类内当作成员函数c 三、日期赋值= 参数类型 返回值 检测是否自己给自己赋值 返回 * this 一个类如果没有显式定义赋值运算符重载,...:用于两个已经定义出的对象间的拷贝赋值 //拷贝构造:一个对象准备定义时,用另一个对象来初始化他 Date d4(d3); d4.print(); Date d5...用于内置类型的操作符,其含义不能改变,例如:内置的整型 + ,不 能改变其含义 作为类成员的重载函数时,其形参看起来比操作数数目少1成员函数的操作符有一个默认的形参this,限定为第一个形参 .

    82120

    【深入浅出C#】章节 4: 面向对象编程基础:构造函数和析构函数

    可以重载:在同一个类中,可以定义多个构造函数,它们具有相同的名称但具有不同的参数列表,以便根据不同的情况进行对象的初始化。...自定义构造函数可以根据需要进行手动调用,以实现特定的初始化逻辑。 重载性:默认构造函数没有重载的概念,每个类只能有一个默认构造函数。...自定义构造函数提供了更大的灵活性和控制权,可以根据具体需求进行对象的初始化和设置。 1.4 构造函数重载 构造函数重载是指在同一个类中定义多个具有不同参数列表的构造函数。...2.3 对象销毁时析构函数的调用顺序 对象销毁时,析构函数的调用顺序遵循以下规则: 子类析构函数先于父类析构函数调用:如果一个类是另一个类的子类,那么在销毁子类对象时,子类的析构函数先于父类的析构函数被调用...对象的成员先于对象本身的析构函数调用:在一个类的析构函数中,对象的成员(如属性、字段、对象引用等)的析构函数会在对象本身的析构函数之前被调用。

    57020

    C++运算符重载(五)之关系运算符重载

    关系运算符重载 作用:重载关系运算符,可以两个自定义类型对象进行对比操作 示例: class Person { public: Person(string name, int age) {...== 函数名:operator加上运算符 参数:有几个操作数就有几个参数,参数类型就是要操作对象的类型 返回值:看运算符运算后的返回值是什么 //存在this指针,要少传一个参数 bool operator..._day; } 公有函数无法访问私有变量,所以运算符重载要写在类内当作成员函数c 三、日期赋值= 参数类型 返回值 检测是否自己给自己赋值 返回 * this 一个类如果没有显式定义赋值运算符重载,...编译器也会生成一个,完成对象按字节序的值拷贝。...:用于两个已经定义出的对象间的拷贝赋值 //拷贝构造:一个对象准备定义时,用另一个对象来初始化他 Date d4(d3); d4.print(); Date d5

    70620

    类和对象(2)

    类的6个默认成员函数 我们需要从下面这两个方面来学习默认成员函数: 1 我们不写时,编译器默认生成的函数行为是什么 2 编译器默认生成的函数不满足我们的需求,我们需要怎样更改 如果一个类中什么都没有,那么被称为空类...,而拷贝构造用于一个对象拷贝初始化给另一个要创建的对象。...如果 const 成员函数需要调用另一个函数,并且该函数可能修改成员变量,那么它应该调用另一个 const 成员函数,或者通过某种方式(如使用指针或引用指向非 const 对象)绕过 const 约束(...要重载,比如想别人获取到指定的内容!  ...,使用编译器生成的默认取地址的重载即可,只有特殊情况,才需 要重载,比如想别人获取到指定的内容。

    9210

    Java面试-面向对象

    Java支持四种继承类型: 单继承:在单继承中,一个类继承另一个属性,即将只有一个父类和一个子类。...多级继承:当一个类派生自一个类,而该类又派生自另一个类,即一个类有多个父类但处于不同级别时,这种继承类型称为多级继承。...您可以做的是在子类中创建另一个具有相同名称的私有方法。让我们看下面的示例,以更好地理解它。...Java中的构造函数是什么? 复制构造函数一个成员函数,用于使用同一类的另一个对象初始化一个对象。尽管在Java中不需要复制构造函数,因为所有对象都是通过引用传递的。...什么是Java中的构造函数重载? 在Java中,构造函数重载是一种将任意数量的构造函数添加到每个具有不同参数列表的类的技术。编译器使用列表中的参数数量及其类型来区分重载的构造函数

    71220

    C++内存管理笔记

    ,可以这样调用析构函数 operator delete(pc); //然后释放内存 对于一个complex对象而言,complex内部没有指针,也就是它的内部没有指向其他内存,析构函数什么都不会做,operator...众多placement new版本特别有用的一个是接受一个指针对象构建在该指针所分配的已分配内存当中,就像上面程序中的new (tmp++) A(i), tmp是指向已分配内存的指针,A(i)则是在已分配内存当中执行构造函数...new函数以及operator delete函数,这时候就有两条路了,一条是编译器调用全局函数,另一条就是编译器调用重载对象的动态分配成员函数,而内存管理就是要让编译器走重载的这条路,构造适合当前对象的内存池...上面说的是重载对象的动态分配成员函数,那么是否可以在全局直接重载全局函数,这是可以的,但不推荐这么做,影响无比深远,所有的动态分配内存都将改变。...下面通过一个例子来看看如何重载,代码如下: #include #include #include using namespace std;

    44520

    【C++】C++基本知识点盘点(1)

    图示: (图中的StackInit函数就是缺省函数,当我们传入栈的地址时且没有传入第二个参数时,它会默认传入另一个参数4) (小声说:图有点小糊...保证就这张!)...程序在编译时的优先顺序:局部域->全局域->展开的命名空间域 图示: 三.访问限定符(C++实现封装的方式) 引入:如小标题所示,我们知道访问限定符是C++实现封装的方式,但是什么是封装呢...图示: 五.函数重载函数重载】 是函数的一种特殊情况,C++允许在同一作用域中声名几个功能类似的同名函数显著特征:这些同名函数的形参列表(个数,类型,类型顺序)不同 注意点:对 返回值...(例:缺省函数) 图示:(注意函数声明时,是否存在缺省函数)StackInit 图中StackPush为函数重载 六....内联函数 1.内敛函数适用“短小,使用频繁的函数” 当实现加法功能时,需要频繁调用加法函数,调用函数的过程中包含着频繁地开辟栈帧空间和关闭空间,会程序运行速度变低。

    15710

    【C++初阶】类与对象:6大默认成员函数------拷贝构造和赋值运算符重载

    拷贝构造函数是构造函数一个重载形式; 2....如果你的拷贝构造函数的形参不是引用,那么在传参的过程中,就会发生实参的拷贝,就又会去调用拷贝构造函数,如此往复,就形成了无穷递归,当然,编译器也不会你传值的,它会直接报错: 3....我们发现自动生成的拷贝构造函数两个不同的对象中的 _arr 的地址相同,这样只要其中一个对象的 _arr 改变,另一个对象里的 _arr 也会改变,这并不是我们想要的结果,而且同一个地址还会被析构两次...3.返回*this :要符合连续赋值的含义; 注意: 赋值运算符只能重载成类的成员函数不能重载成全局函数,因为重载成全局的,类里面又会自动生成一个,这样编译器就无法分辨; 如果没有显示定义赋值运算符重载...四.区分拷贝构造和赋值运算符重载 1.当我们用一个已经存在对象去初始化另一个对象时,即使写的是 “ = ” ,此时也调用它的拷贝构造函数; 2.已经存在的两个对象之间赋值拷贝,此时是赋值运算符重载

    14610
    领券