社区
C++ 语言
帖子详情
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
打赏
收藏
void func(int x)和void func(const int x)为什么不能重载?
void func(int x)和void func(const int x)为什么不能重载? 而void func(int *p)和void func(const int *p)却可以重载。 请给我讲一下深层次的语言 比如设计的时候是不是考虑到什么问题。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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)
函数
重载
定义: 1.一组函数,其中函数名相同,参数列表的类型和个数不同,这一组函数称为函数
重载
。 Q:为什么C语言代码不支持函数
重载
? A:C++代码产生的函数符号是由函数名+参数列表类型构成的,C代码产生的符号只有函数名。 2.一组函数想要构成
重载
必然要处在同一作用域当中 bool compare(
int
a,
int
b){//compare_
int
_
int
return a>b; } bool compare(double a,double b){//compare_double_double ret
函数
重载
问题
那么为什么
void
func
(
int
a);
void
func
(
const
int
a);不是函数
重载
呢? 一
void
func
(
int
* a);
void
func
(
int
*
const
a); //不是函数
重载
二
void
func
(
int
* a);
void
func
(
const
int
* a); //...
【C++】
const
成员函数
const
(常)成员函数是一种获取对象状态的成员函数,并且
不能
改变对象的状态(也就是
不能
修改对象的成员的值)。声明和定义如下: class A { public:
void
func
()
const
; }; A::
void
func
()
const
{ // 常成员函数 } 问题一:如果有两个同名函数,只是其中一个是常成员函数,这样的写法有错吗? class A { public: vo...
const
int
*,
const
int
*
const
和
int
const
*有什么区别?
我总是搞砸了如何正确使用
const
int
* ,
const
int
*
const
和
int
const
* 。 是否有一组规则定义您可以做什么和
不能
做什么? 我想知道在分配,传递给函数等
C++_函数
重载
//***** 普通函数
重载
*****
void
func
(
int
);
void
func
(long);
void
func
(float);
void
func
(double);
void
func
(
int
a) { std::cout << a << std::endl; }
void
func
(long b) { std::cout << b << std::endl;
C++ 语言
64,649
社区成员
250,477
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章