关于重载的问题

jackhu 2002-03-04 05:36:08
请教各位老师:
为何"int abs(int a);
double abs(double f);"
编译器可识别重载;
而"char f(char x);
int f(int x);"
不能重载?
...全文
23 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
school 2002-03-05
  • 打赏
  • 举报
回复
同名函数的参数不同(包括类型、顺序不同),那么容易区别出它们是不同的函数(重载函数)。同名函数仅仅是返回值类型不同,有时可以区分,有时却不能。
k_f 2002-03-05
  • 打赏
  • 举报
回复
char f(char a)
{
return a;
}
int f(int a )
{
return a;
}
在Dev-C++4.0下编译不过,显示错误
e:\temp\temp.cpp: In function `int main()':
e:\temp\temp.cpp:7: parse error before `{'
e:\temp\temp.cpp: At top level:
e:\temp\temp.cpp:16: parse error before `}'

标准C++究竟是怎么规定的
jackhu 2002-03-05
  • 打赏
  • 举报
回复
多谢楼上的各位老师指教!
tlovexyj 2002-03-05
  • 打赏
  • 举报
回复
gigix说得很全的,我就没什么好说的了。
spirix 2002-03-05
  • 打赏
  • 举报
回复
如果仅仅是两个返回值不同的话,是不可以重载的,比如:
int abs(int a);
double abs(double f);"
编译器可识别重载;
而char f(int x);
int f(int x);
编译器是不可识别重载的原因如下:
如果是返回值不同,在调用前编译器并不知道重载函数中的某个的返回值。打个比方:如果门外一个男人,一个mm,而你在不知道具体那个是mm的情况下对自己说,我只能让mm进来!你的想法存在二义性,因为只有当某个人进来了,你才知道是男是女。









































gigix 2002-03-05
  • 打赏
  • 举报
回复
每个函数在编译器那里都有一个唯一的名字,编译器会根据函数所属的类、函数名、参数列表、const形态和自己的规则来生成这个名字。比如说,下面这个类:

class MyClass{
void MyFunction(int);
};

MyFunction这个函数在编译器那里的名字可能就是这样:

member_MyClass_void_MyFunction_int_nonConst

当然,这只是我的一相情愿。你可以看看VC编译器的输出结果,那里会有处理以后的函数名。另外可以看看《深度探索C++对象模型》,也有讲到这些。

在调用的时候就很简单了。因为每个函数实际上是有各自不同的名字的。假设我有这样两个重载方法(现在比较喜欢说“方法”,就是“函数”的意思):

void func1(int);
void func1(double);

当在client里面这样写:

int a = func1(2);

编译器就会知道,我传递给func1的是一个int型,它当然就会去调用那个接受int参数的重载函数了。

那么,为什么不能通过返回值重载呢?因为你可以根本不要返回值,你可以这样写:

func2();

那么谁知道func2的返回值是什么类型呢?谁都不可能知道。
jackhu 2002-03-05
  • 打赏
  • 举报
回复
感谢楼上各位老师指教,c++标准是不支持“同名函数仅仅是返回值类型不同”的重载,我在vc60下编译不能通过。我想知道编译器如果能通过重载,内部应是如何工作的?特别关注!!
piaorenqian 2002-03-05
  • 打赏
  • 举报
回复
关注
jackhu 2002-03-05
  • 打赏
  • 举报
回复
继续关注!!
jackhu 2002-03-05
  • 打赏
  • 举报
回复
感谢楼上各位老师指教,c++标准是不支持“同名函数仅仅是返回值类型不同”的重载,我在vc60下编译不能通过。我想知道编译器如果能通过重载,内部应是如何工作的?特别关注!!
windindance 2002-03-04
  • 打赏
  • 举报
回复
char f(char a)
{
return a;
}
int f(int a )
{
return a;
}

在UNIX下CC编译通过。
LANDFISH 2002-03-04
  • 打赏
  • 举报
回复
嗯,有道理,我也觉得应该是可以重载的。
windindance 2002-03-04
  • 打赏
  • 举报
回复
f(int)
zf925 2002-03-04
  • 打赏
  • 举报
回复
肯定不行!!!!!!!!!!
f(10)你说调用的是谁??????
snipersu 2002-03-04
  • 打赏
  • 举报
回复
应该行。你用的是啥编译器?
ty3310 2002-03-04
  • 打赏
  • 举报
回复
标C++
到底是过还是不过,
我怎么知道我用的IDE的编译器
是不是支持标准C++?
windindance 2002-03-04
  • 打赏
  • 举报
回复
标准C++:
int f();
char f();
//ERROR!!!参数相同

int f(int);
char f(char);
//OK:参数不同
tramp_man 2002-03-04
  • 打赏
  • 举报
回复
根据标准C++, 是应该过的!
wyzegg 2002-03-04
  • 打赏
  • 举报
回复
标准C++应该是
编译不过的
windindance 2002-03-04
  • 打赏
  • 举报
回复
char f(char a)
{
ShowMessage(a);
return a;
}
int f(int a )
{
ShowMessage(a);
return a;
}

可以重载。
BCB5.0下编译通过。
加载更多回复(4)

15,440

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧