编译器为什么越界函数越重载
❶ 什么函数不能重载,为什么
函数重载要求编译器能够唯一地确定调用一个函数时应执行哪个函数代码,即采用哪个函数实现。确定函数实现时,要求从函数参数的个数和类型上来区分。这就是说,进行函数重载时,要求同名函数在参数个数上不同,或者参数类型上不同。否则,将无法实现重载。例如,可以给函数名add()定义多个函数实现,该函数的功能是求和,即求两个操作数的和。其中,一个函数实现是求两个int型数之和,另一个实现是求两个浮点型数之和,再一个实现是求两个复数的和。
❷ C++如何实现函数重载的,即C++编译系统如何区分不同的重载函数
编译之后,同名的函数会根据其参数的不同等对名字做处理
比如说
int num() - > num@xxyy
int num(int n) - > num@aabbcc
我只是举例子,实际上生成的符号可能有所区别,但是c++的编译器就是这么处理重载的,你使用vc自带的mpbin可以查看dll的导出符号,或者自己编写一个dll导出重载的函数,然后命令行
mpbin -exports XX.dll > a.txt
可以查看你的同名的函数被编译器分配了一个什么样的名称~~@符号之后的字符串肯定不同的,@前面的函数名是一样的~
不知道你清楚了没,不然我明天给你发一下我的截图,之前我做COM互操作研究了一下~~可以切磋下~~
❸ 函数重载是否可以理解为重新定义函数
在C/C++里函数的重新定义是指两个函数原型完全相同,只是其具体实现不同,而函数的重载则是两个函数具有相同的函数名,但其函数签名不名.(函数签名是由函数的参数列表来决定的,不同的参数类型,不同的参数数量及不同的参数顺序都可以说两个函数具有不同的签名).函数重载设计的初衷是用同一个函数可以处理不同类型的数据.比如你有一个函数是int max(int a,int b);在你调用这个函数时,如果传递给这个函数两个非int型的参数,编译器就会报错,因为你定义的该函数只接收两个int型的参数,如果你想让它处理double型的数据,你可以再写一个函数double max(double a,double b);这样这两个函数就构成了重载.
❹ C++的函数重载有何意义!
在你这个简单的程序里显示的结果可能是一样的
重载会在很多地方用到
而且在这个程序里两者返回值一个是int型,一个是double型的,如果这个结果还涉及运算可能就会不同了。
比如用add结果来除以或乘以一个double型的数。
❺ 为什么函数重载时仅仅返回值不同是不允许的
假设你有两个返回值不同的函数,比如
int getvalue(viod) {return value1;}
float getvalue(viod) {return value;}
那么当你去调用他们的时候,由于你调用的时候
写的是
getvalue();
于是你的编译器就无法知道 你调用的是上面哪个 函数(因为两个函数都不用传参数,编译器无法区分它们), 所以就会报错。
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
如果你写成这样 (函数重载)
int getvalue(int i, int j) {return value1;}..................1
float getvalue(viod) {return value;}......................2
那么当你当你调用
getvalue()编译器就会知道 你调用的是第2个函数
getvalue(2, 3) 编译器就会知道 你调用的是第1个函数
就不会出错了。
❻ 为什么函数重载的目的是减少空间
函数重载是指在同一作用域内,可以有一组具有相同函数名,不同参数列表的函数,这组函数被称为重载函数。重载函数通常用来命名一组功能相似的函数,这样做减少了函数名的数量,避免了名字空间的污染,对于程序的可读性有很大的好处。
如果没有函数重载机制,如在C中,你必须要这样去做:为这个print函数取不同的名字,如print_int、print_string。这里还只是两个的情况,如果是很多个的话,就需要为实现同一个功能的函数取很多个名字,如加入打印long型、char*、各种类型的数组等等。、
类的构造函数跟类名相同,也就是说:构造函数都同名。如果没有函数重载机制,要想实例化不同的对象,那是相当的麻烦!不用为了对不同的参数类型或参数个数,而写多个函数。多个函数用同一个名字,但参数表,即参数的个数或(和)数据类型可以不同,调用的时候,虽然方法名字相同,但根据参数表可以自动调用对应的函数。如果我们使用reflector去查看微软写的.net的基类库的话,我们可以发现他使用很多的方法重载,这样我们在调用的时候,就不需要记那么多的方法名称,而是知道了方法的功能就可以直接的给他传递不同的参数,编译器会明确的知道我们调用了哪一个方法。操作符重载,本质上就是函数重载,它大大丰富了已有操作符的含义,方便使用,如+可用于连接字符串等。
❼ 如下程序 编译器没报错,越界了,为什么 就是一个函数的重载啊 难道同名的函数重载不起,求解释。
LZ犯了一个低级错误。
还记得C++如果设计一个函数实现两个数的交换要怎样做么?
像swap(int a, int b )是不会成功的,要传入指针或引用!
inline void space(int *&a);做了这个工作
但是void space(int **a)没有,改为
void space(int **&a)可行了
给我分吧。。。。。我看了很久才看出来啊!!!!
❽ 函数重载是什么意思
所谓重载,是同一函数名,但是参数类型或参数个数不同的函数。比方说,你可以定义add函数为两个实数的相加;然后定义重载函数,实现两个复数的相加。
在主函数或其他函数中调用add函数,你的参数类型不同,编译器也会自动识别匹配,不会出现调用error。
更详细可以看网络,或者课本:
http://ke..com/link?url=_Xw7Dz8-P6EWj5_CGVhcmAcaM9CZ-ghk-eXjt0NI08JRMErjRzjsSkX64wQhiS--
❾ C++中参数为引用和参数为形参的两个函数为什么可以形成重载
这个问题我本来也不太清楚,请教了别人才知道
首先,这不是重载
你传进去的参数a,b是 int 类型的,如果你传进去的是double类型的,编译器是会出错的
比如:
double d = 3;
cube(d);
编译器根本不知道你想调用的是哪个函数,因为两个函数都符合,因此编译不通过
而如果传递的是 int 类型或者其他类型,int 类型就能转换成 double 类型了
而对于cube(double&)这个函数,由于有个&,其实是要找到double类型的内存才能匹配上,传int进去是不行的,因此你的代码能编译通过