函数重载

来源:互联网 发布:sql查询字段重复记录 编辑:程序博客网 时间:2024/05/18 01:52

什么是函数重载

同一个作用域中,如果有多个函数的名字相同,但是形参列表不同——也称函数特征标(参数类型不同或参数个数不同),返回值类型可同也可以不同,我们称之为函数重载。

void testOverload(int a);void testOverload(double a);void testOverload(short a);void testOverload(long a);

编译器在检查函数特征标时,将把类型引用和类型本身视为同一个特征标,如下就不属于函数重载。

double cube(double x);double cube(double &x);

什么是名称修饰

C++如何跟踪每一个重载函数呢?它给这些函数指定了秘密身份。使用C++开发工具中的编译器编写和编译程序时,C++编译器将执行一些神奇的操作——名称修饰(name decoration)或名称矫正(name mangling),它根据函数原型中指定的形参类型对每个函数名进行加密。


这里写图片描述

虽然testOverload函数名一样,但是他们在符号表中生成的名称不一样。’?’表示名称开始,’?’后边是函数名,”@@YA”表示参数标开始,”X”表示返回值,后面几位是参数类型,”@Z”表示名称结束。

查看符号表的方法

工程名右击–>属性–>链接器–>调试–>生成映射文件选择是。

重载与作用域

void print(double);void print(char *);void fun(){    void print(int);//新作用域,隐藏了之前的print    print("hello world");//错误 print(char *)被隐藏了    print(6.66);//正确 调用的是print(int);  print(double)被隐藏了}

当调用print函数时,编译器首先寻找对该函数的声明,找到的是接受int值的那个局部声明,一但在当前作用域中找到了所需要的名字,编译会忽略掉外层作用域中的同名实体。之后就是检查函数调用是否有效。所以,一般将函数的声明都置于全局作用域中。

0 0