如题,下面的代码中为什么编译运行都没有问题
#include<iostream>
using namespace std;
double cube(double a); //A
double cube(double &a); //B为什么这两个函数可以构成重载,编译的时候没有出现问题
int main()
{
int a=2, b=3;
cout<<a<<" to 3 power is "<<cube(a)<<endl; //C
cout<<b<<" to 3 power is "<<cube(b)<<endl; //D运行这两行代码的时候却都只是调用的A行的函数,没有调用到B行的函数
}
double cube(double a)
{
a*=a*a;
return a;
}
double cube(double &a)
{
a*=a*a;
return a;
}
在这种情况下,有没有办法调用B行参数为引用的函数?
C++中参数为引用和参数为形参的两个函数为什么可以形成重载?
答案:6 悬赏:10 手机版
解决时间 2021-03-08 21:32
- 提问者网友:两耳就是菩提
- 2021-03-08 10:51
最佳答案
- 五星知识达人网友:酒者煙囻
- 2021-03-08 12:03
这个问题我本来也不太清楚,请教了别人才知道
首先,这不是重载
你传进去的参数a,b是 int 类型的,如果你传进去的是double类型的,编译器是会出错的
比如:
double d = 3;
cube(d);
编译器根本不知道你想调用的是哪个函数,因为两个函数都符合,因此编译不通过
而如果传递的是 int 类型或者其他类型,int 类型就能转换成 double 类型了
而对于cube(double&)这个函数,由于有个&,其实是要找到double类型的内存才能匹配上,传int进去是不行的,因此你的代码能编译通过
首先,这不是重载
你传进去的参数a,b是 int 类型的,如果你传进去的是double类型的,编译器是会出错的
比如:
double d = 3;
cube(d);
编译器根本不知道你想调用的是哪个函数,因为两个函数都符合,因此编译不通过
而如果传递的是 int 类型或者其他类型,int 类型就能转换成 double 类型了
而对于cube(double&)这个函数,由于有个&,其实是要找到double类型的内存才能匹配上,传int进去是不行的,因此你的代码能编译通过
全部回答
- 1楼网友:千杯敬自由
- 2021-03-08 15:05
同意楼上的吧
这点突然没看清,你看int类型在上升为double类型的时候肯定上升为一个右值啊,但是重载的引用应该要求是左值啊
- 2楼网友:何以畏孤独
- 2021-03-08 14:40
我也遇到这个问题。挺有意思的。如果参数不是引用,那么函数不会出现多态现象,如果是参数引用就会出现多态特性。也就是说,对于参数是对象的引用和对象来说,函数表现是不一样的。编译器应该构成重载才好,现实中可能出现这样的需求。但是这也是很危险的。首先就是引用的定义要发生改变,不能再说是对象的别名,他和对象还是有区别的。
- 3楼网友:一叶十三刺
- 2021-03-08 14:33
同意楼上几位的, 对于这种需求我会这样作
double cube(const double& a);//A
double cube(double &a); //B
根据参数的const属性可决定运行的是哪个函数.
- 4楼网友:逐風
- 2021-03-08 14:11
你这个里的int a=2, b=3; 定义是为int形式 ,没有精确的 所以调用时候会提升为double来匹配,
对于引用参数来说,如果实参是该引用的有效初始值,则该实参是精确匹配。如果该实参不是引用的有效初始值,则不匹配。
所以不会匹配double &a
- 5楼网友:时间的尘埃
- 2021-03-08 12:31
void f(t)传递的是t类型对象的副本;void f(t&)传递的是t类型对象本身,这个比c语言的指针传递效率更高,编译器甚至优化到根本没有引用这回事,直接到对对象操作。还t&要求传递的是左值,它的实参绝不能是临时对象。如:
void f(int);
void g(int&);
void h()
{
int x = 0;
f(x); // 复制x的副本,这个副本在函数f结束后被销毁
g(x); // 引用x本身,函数g对x的任何修改都会对x本身进行。
f(0); // 复制int(x)的副本。
g(0); // 不可以,因为非常量引用(常量引用const t&,非常量引用t&)不能够引用非对象。
}
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯