c ++ overload 3具有不同参数的函数(int,* int和& int)

时间:2016-03-05 21:10:23

标签: c++ pointers reference overloading sqrt

所以我要完成这项功课"使用函数重载定义3个具有相同名称但具有不同的prams类型(int,int *,int&)的函数,它们将返回值的平方根。&# 34;好吧,我做到了,但我不知道它给了我这个错误:"模糊调用重载函数"。我尝试修复但没有成功...... 这是我的代码,非常简单:

#define _CRT_SECURE_NO_WARNINGS
#include <math.h>
#include <iostream>
using namespace std;

double rad(int);
double rad(int*);
double rad(int&);

int main(){
int a,*pt=&a;
cin>>a;
cout<<"Radical din "<<a<<" este "<<rad(a)<<endl;
cout<<"Radical din "<<a<<" este "<<rad(pt)<<endl;
cout<<"Radical din "<<a<<" este "<<rad(&a)<<endl;
return 0;
}

double rad(int x){
    return  (sqrt(x));
}
double rad(int *x){
    return  (sqrt(*x));
}
double rad(int &x){
    return  (sqrt(x));
}

4 个答案:

答案 0 :(得分:7)

鉴于这些声明:

double rad(int);   // (1)
double rad(int*);  // (2)
double rad(int&);  // (3)

轻松处理(2)。我们要么有指针,要么我们没有,可能没有混淆。那么问题是,会发生什么:

int a;
rad(a);

嗯,这里(1)(3)都有效。实际上,在确定最佳候选人是什么的规则中,两者之间实际上没有任何偏好!这是一个模棱两可的调用,所以这总是无法编译。

请注意, 可以明确地调用(1) - 只需传入int您无法参考:

rad(4); // calls (1), since neither (2) nor (3) are possible

另请注意,即使使用(1)这样的命名变量,也可以调用(3)a,但我们无法通过重载决策来执行此操作。我们必须明确地告诉编译器我们想要哪个函数。要做到这一点,我们必须抛出名称:

int a;
static_cast<double(*)(int)>(rad)(a);  // calls (1) explicitly
static_cast<double(*)(int&)>(rad)(a); // calls (3) explicitly

答案 1 :(得分:1)

int test_val = 5;    

// accept rvalue reference
double rad(int &&x) {
    return  (sqrt(x));
}
rad(5);

// accept pointer
double rad(int *x) {
    return  (sqrt(*x));
}
rad(&test_val);

// accept lvalue reference
double rad(int &x) {
    return  (sqrt(x));
}
rad(test_val);

答案 2 :(得分:1)

在第三种情况下,您应该使用右值引用(&#39; int&amp;&amp;&#39;)代替左值引用(&#39; int&amp;&#39;),以免混淆编译器。像这样:

#define _CRT_SECURE_NO_WARNINGS
#include <math.h>
#include <iostream>
using namespace std; 

double rad(int);
double rad(int*);
double rad(int&&);

int main(){
int a,*pt=&a;
cin>>a;
cout<<"Radical din "<<a<<" este "<<rad(a)<<endl;
cout<<"Radical din "<<a<<" este "<<rad(pt)<<endl;
cout<<"Radical din "<<a<<" este "<<rad(&a)<<endl;
return 0;
}

double rad(int x){
    return  (sqrt(x));
}
double rad(int *x){
    return  (sqrt(*x));
}
double rad(int &&x){
    return  (sqrt(x));
}

答案 3 :(得分:0)

其他答案的前奏: 致电

rad(int)

rad(int& x)
看起来一样 - rad(a)。 这条线

rad(&a);

调用rad(int *);