美文网首页
C++函数重载

C++函数重载

作者: OriginalS_TZ | 来源:发表于2018-06-08 16:45 被阅读7次

我们知道,函数重载是指在同一作用域内,可以有一组具有相同函数名,不同参数列表的函数,这组函数被称为重载函数

那么为什么我们不能通过返回类型的不同来进行函数重载?

因为在编译中,每一个函数都会按照一定的规则进行映射

test.cpp

namespace t{
    float test(float i)
    {
        i = 1.2;
        return i;
    }

    float test() {
        return 1.2;
    }
}

float test(float i) {
    i = 3.4;
    return i;
}

int test(int i)
{
    i = 1;
    return i;
}

float output(float i, int d) {
    d = 3;
    i = 1.4;
    return i;
}

然后我们查看它的汇编代码

g++ -g -c test.cpp
objdump -S test.o > test_obj.s //可以和源代码一起看,酸爽!

1.o:    file format Mach-O 64-bit x86-64

Disassembly of section __TEXT,__text:
__ZN1t4testEf:
; {
       0:   55  pushq   %rbp
       1:   48 89 e5    movq    %rsp, %rbp
       4:   f3 0f 10 0d 8c 00 00 00     movss   140(%rip), %xmm1
       c:   f3 0f 11 45 fc  movss   %xmm0, -4(%rbp)
; i = 1.2;
      11:   f3 0f 11 4d fc  movss   %xmm1, -4(%rbp)
; return i;
      16:   f3 0f 10 45 fc  movss   -4(%rbp), %xmm0
      1b:   5d  popq    %rbp
      1c:   c3  retq
      1d:   0f 1f 00    nopl    (%rax)

__ZN1t4testEv:
; float test() {
      20:   55  pushq   %rbp
      21:   48 89 e5    movq    %rsp, %rbp
      24:   f3 0f 10 05 70 00 00 00     movss   112(%rip), %xmm0
; return 1.2;
      2c:   5d  popq    %rbp
      2d:   c3  retq
      2e:   66 90   nop

__Z4testf:
; float test(float i) {
      30:   55  pushq   %rbp
      31:   48 89 e5    movq    %rsp, %rbp
      34:   f3 0f 10 0d 64 00 00 00     movss   100(%rip), %xmm1
      3c:   f3 0f 11 45 fc  movss   %xmm0, -4(%rbp)
; i = 3.4;
      41:   f3 0f 11 4d fc  movss   %xmm1, -4(%rbp)
; return i;
      46:   f3 0f 10 45 fc  movss   -4(%rbp), %xmm0
      4b:   5d  popq    %rbp
      4c:   c3  retq
      4d:   0f 1f 00    nopl    (%rax)

__Z4testi:
; {
      50:   55  pushq   %rbp
      51:   48 89 e5    movq    %rsp, %rbp
      54:   89 7d fc    movl    %edi, -4(%rbp)
; i = 1;
      57:   c7 45 fc 01 00 00 00    movl    $1, -4(%rbp)
; return i;
      5e:   8b 45 fc    movl    -4(%rbp), %eax
      61:   5d  popq    %rbp
      62:   c3  retq
      63:   66 66 66 66 2e 0f 1f 84 00 00 00 00 00  nopw    %cs:(%rax,%rax)

__Z6outputfi:
; float output(float i, int d) {
      70:   55  pushq   %rbp
      71:   48 89 e5    movq    %rsp, %rbp
      74:   f3 0f 10 0d 28 00 00 00     movss   40(%rip), %xmm1
      7c:   f3 0f 11 45 fc  movss   %xmm0, -4(%rbp)
      81:   89 7d f8    movl    %edi, -8(%rbp)
; d = 3;
      84:   c7 45 f8 03 00 00 00    movl    $3, -8(%rbp)
; i = 1.4;
      8b:   f3 0f 11 4d fc  movss   %xmm1, -4(%rbp)
; return i;
      90:   f3 0f 10 45 fc  movss   -4(%rbp), %xmm0
      95:   5d  popq    %rbp
      96:   c3  retq

从上面我们不难看出

  • __ZN1t4testEf int t::test (int)
  • __ZN1t4testEv: float t::tset(void)
  • __Z4testf : float test(float i)
  • __Z4testi : int test(int)
  • __Z6outputfi : float output(float, int)

根据上面的对比,我们大致可以推断出命名规则为作用域+函数名+参数类型

例如 : ZN1t4 和Z4 代表两个不同的作用域

而output的Z6 output fi中的fi则表示的是参数类型,f表示float,i表示int

综上所述,映射后的函数名完全没有返回值什么事,当你调用一个函数,编译器首先要看看函数名列表,然后根据你的参数进行一个匹配

重载中最重要的就是对应函数的查找,为了正确查找函数,我们不能定义两个参数类型和函数名一样的函数,这是编译器生成的代码规则所决定的

如果你两个函数的作用域,函数名,参数类型都一样,那么也查找不到对应的函数了,如下(错误的代码)

//汇编之后的函数名(用下划线分割规则)
int test() {return 1;} 
//__Zn_test_v
float test() {return 1.2;}
//__Zn_test_v
//两个都是一样的,二义性

这就是为什么不能仅仅通过返回值类型不同来进行重载

相关文章

  • 2.C++对C的扩展

    重载(overload) C++中,引用了函数重载的概念,函数名同名,参数列表不同形成重载。重载规则: 函数名相同...

  • Vue3源码中的TypeScript重载函数的作用

    TypeScript重载函数的作用案例 C++中的一个概念(百度百科): 函数重载一般指重载函数。 重载函数是函数...

  • 30小时快速精通C++拾遗

    C语言不支持重载,为什么C++支持重载? C语言不支持函数重载,编译时函数名加上_或者其他标识C++为什么能够重载...

  • C++运算符重载

    C++运算符重载的实质:运算符重载的实质就是函数重载或函数多态。运算符重载是一种形式的C++多态。目的在于让人能够...

  • 1.2.15_C++ 关系运算符重载

    C++ 重载运算符和重载函数 C++ 语言支持各种关系运算符( < 、 > 、 <= 、 >= 、 == 等等),...

  • Callback / Callable 类型

    重载函数,和php的伪重载函数 重载函数a. c++允许在同一范围中声明几个功能类似的同名函数,但是这些同名函数的...

  • C++基础语法-重载、extern

    函数重载 今天我们来深入学习下C++的基础语法函数重载。函数重载定义:只要函数名相同,参数个数不同,参数类型不同,...

  • C++ 重载 [] = == !=

    一 重载 [] = == != 1.1 重载[] C++ 规定,下标运算符[ ]必须以成员函数的形式进行重载。该重...

  • 2020-07-06----《C++类的学习》

    函数重载:同名不同参。 C++类的特点:封装、继承、多态。 //多态与函数重载是啥关系? 虚函数:和软件架构相关 ...

  • C语言到C++(4) - 重载

    C++中新增了重载功能,重载分为两部分,函数重载和运算符重载。 1. 函数重载 在C语言编程中,我们经常遇到一组函...

网友评论

      本文标题:C++函数重载

      本文链接:https://www.haomeiwen.com/subject/vbmasftx.html