void func(int x)和void func(const int x)为什么不能重载?

Rtubo 2004-11-09 09:41:25
void func(int x)和void func(const int x)为什么不能重载?
而void func(int *p)和void func(const int *p)却可以重载。
请给我讲一下深层次的语言
比如设计的时候是不是考虑到什么问题。
...全文
399 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
koalapheonix 2004-11-14
  • 打赏
  • 举报
回复
zhangfjj(小张(生命不息,灌水不止。)) ( ) 信誉:105 2004-11-09 10:03:00 得分: 0


对于传值调用来说,用const修饰,如你所说的
void func(const int x),好象给人意思是x在函数中不能修改,其实不然。
这要涉及到接口的透明度问题。按值传递时,对用户而言,这是透明的,也即传递的是实参的副本,本来不会对实参形成修改,用户不知道函数对形参做了什么手脚,在这种情况下进行重载是没有意义的,所以规定不能重载!


当指针或引用,用户就会对函数的操作有了一定的了解,不再是透明的了,即可能通过指针或引用修改实参的值,所以用const修饰指针和引用,这时重载是有意义的,所以规定可以重载。


是对的
ywchen2000 2004-11-11
  • 打赏
  • 举报
回复
hehe,向小张学习
umbrella1984 2004-11-10
  • 打赏
  • 举报
回复
这代码可读性太差了,郁闷,。
kingmoonII 2004-11-10
  • 打赏
  • 举报
回复
const是函数创建者的工具,而不是函数调用者的工具
这句话能不能多解释一下啊??
因为int * 和const int *是两种不同类型的指针
可不可以这样理解呢,int * 是指向int的指针,而const int* 是指向一个常量int的指针?
那么他们在传递的时候,分别传递了什么呢?

wxu2 2004-11-09
  • 打赏
  • 举报
回复
楼上的解析的比较清晰
但是我还有有点不明,既然const用于实参是无意义的,那为什么还允许在实参中用const修饰呢。
zhangfjj 2004-11-09
  • 打赏
  • 举报
回复
如果只想单纯知道为什么不能重载,上面所说二义性问题也可以算是一种说法吧。
但是:======
void fn(const int x)
void fn(int x)

按照严格的匹配,fn(10)应该去匹配void fn(const int x),因为10是const int型。
为什么 10--->可以传递给const int x也可以传递给int x而导致二义性呢?

这里就要问BS--C++的创立者了!(先在C++中引入const,C后来才引入const.)

用const 修饰形参的目的是什么?
void fn(const int *p)//这里是防止在函数中对p所指向的数据进行修改吧
{}
正是因为传递的是指针,如果不用const,可能会导致*p被修改。
也即用指针或引用作参数时,函数的黑盒效应被破坏了,函数内部对调用者有一定的了解度了。
所以对于const int *p用来限制,这样的重载有了意义。

而在传值调用时,传递的是实参的副本,对于用户来说,函数是透明的,用const
显然不是为了防止在函数中对形参的修改,而是防止在函数中对实参的修改,而这种重载因为
传递的是实参的副本,变得没有意义,所以C++中就规定了这种情况下不能重载。


读了几遍书,写给大家看!
allywin 2004-11-09
  • 打赏
  • 举报
回复
同意一楼的。
zhangfjj 2004-11-09
  • 打赏
  • 举报
回复
依你说:
void func(const int *)和void func(int *)可重载
void func(const int)和void func(int)却不可重载,事实上const int和int也是有区别的,区别也不小于const int *和int *吧。
所以好些品味这句话吧:const是函数创建者的工具,而不是函数调用者的工具
zhangfjj 2004-11-09
  • 打赏
  • 举报
回复
最近也在看const专题,
所以在C++编程思想一书中,人家说:在函数里,const 有这样的意义:参数不能被改变,所以它其实是函数创建者的工具,而不是函数调用者的工具
zhangfjj 2004-11-09
  • 打赏
  • 举报
回复
void func(const int x)
这样定义当然可以,但你这里用const修饰形参想干什么呢?是保证实参不被修改,还是在函数中对形参使得它不变?
sharkhuang 2004-11-09
  • 打赏
  • 举报
回复
主要还是看有没有二意性。比如重载了函数
void func(int x)和void func(const int x),当这样调用时func(10),不能判断是调用哪个。
但是重载void func(int *p)和void func(const int *p)却可以,也许你会奇怪func(&10)怎么调用啊?哦,原来int型常数是不能取地址的



解释很清楚了!!!!!!!


Henry0 2004-11-09
  • 打赏
  • 举报
回复
应该是二义性的问题吧

zhangfjj(小张(生命不息,灌水不止。)) :难道我们不能定义这样的函数吗:void func(const int x)

如果能的话,那不能重载的原因
就不应该是
此const参数本来就没什么意义的原因了
zhangfjj 2004-11-09
  • 打赏
  • 举报
回复
C++编程思想里专门对此进行了讨论。(P181)
用const 修饰传值调用的形参,即实参不被修改。然而由于是传递的是实参副本,这个约定是隐式的!
在函数里,const 有这样的意义:参数不能被改变,所以它其实是函数创建者的工具,而不是函数调用者的工具(原译文如此)
呵呵,当然func(10)中,10其实是一个const int.
xuzheng318 2004-11-09
  • 打赏
  • 举报
回复
一个函数是否能重载,一定要没有二意性,
正如“carylin(别信我,我在说谎”说得,如果 func(10) 就不能判断是那个函数!
还有一点 重载函数只看返回值是不能判断是否是重载函数,一定要看参数!
zhangfjj 2004-11-09
  • 打赏
  • 举报
回复
对于传值调用来说,用const修饰,如你所说的
void func(const int x),好象给人意思是x在函数中不能修改,其实不然。
这要涉及到接口的透明度问题。按值传递时,对用户而言,这是透明的,也即传递的是实参的副本,本来不会对实参形成修改,用户不知道函数对形参做了什么手脚,在这种情况下进行重载是没有意义的,所以规定不能重载!


当指针或引用,用户就会对函数的操作有了一定的了解,不再是透明的了,即可能通过指针或引用修改实参的值,所以用const修饰指针和引用,这时重载是有意义的,所以规定可以重载。
carylin 2004-11-09
  • 打赏
  • 举报
回复
主要还是看有没有二意性。比如重载了函数
void func(int x)和void func(const int x),当这样调用时func(10),不能判断是调用哪个。
但是重载void func(int *p)和void func(const int *p)却可以,也许你会奇怪func(&10)怎么调用啊?哦,原来int型常数是不能取地址的。
mathe 2004-11-09
  • 打赏
  • 举报
回复
void func(int x)和void func(const int x)不能重载
所以void func(int *p)和void func(int *const p)也不能重载。
而void func(int *p)和void func(const int *p)可以重载是
因为int * 和const int *是两种不同类型的指针
而 int 同const int,或者int *, int *const,是同一种数据类型的const和非const类型,
对于形参,是否const对于调用者来说没有区别。
BluntBlade 2004-11-09
  • 打赏
  • 举报
回复
使用一个变量去调用这个函数,就会产生二义性了咯:)
lu1172101275 2004-11-09
  • 打赏
  • 举报
回复
好问题,我有收获
chrislv 2004-11-09
  • 打赏
  • 举报
回复
也就是说本来CONST在形参处用意是为了指针?
加载更多回复(1)

64,649

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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