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

use*_*909 4 c++ pointers overloading reference sqrt

所以我有这个功课要做"使用函数重载定义具有相同的名称,但不同的婴儿车3个型功能(INT,INT*,INT和),将返回值的平方根." 好吧,我做了它,但我不知道它给了我这个错误:"模糊调用重载函数".我尝试修复但没有成功......这是我的代码很简单:

#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));
}
Run Code Online (Sandbox Code Playgroud)

Bar*_*rry 7

鉴于这些声明:

double rad(int);   // (1)
double rad(int*);  // (2)
double rad(int&);  // (3)
Run Code Online (Sandbox Code Playgroud)

处理(2)很容易.我们要么有一个指针,要么我们没有,没有可能的混淆.那么问题是,会发生什么:

int a;
rad(a);
Run Code Online (Sandbox Code Playgroud)

那么,在这里都(1)(3)工作.实际上,在确定最佳可行候选者的规则中,两者之间实际上没有任何偏好!这是一个模糊的调用,因此总是无法编译.


请注意,这可能的显式调用(1)虽然-通过简单地传递一个int,你不能拿一个参考:

rad(4); // calls (1), since neither (2) nor (3) are possible
Run Code Online (Sandbox Code Playgroud)

还需要注意的是它可以调用(1)或者(3)即使有命名的变量一样a,但我们不能依靠重载做到这一点.我们必须明确地告诉编译器我们想要哪个函数.要做到这一点,我们必须抛出名称:

int a;
static_cast<double(*)(int)>(rad)(a);  // calls (1) explicitly
static_cast<double(*)(int&)>(rad)(a); // calls (3) explicitly
Run Code Online (Sandbox Code Playgroud)

  • 要调用引用参数函数,可以通过`static_cast`将函数名称指向此函数类型来消除歧义.我不会称作业"不合逻辑".相反,它教导好学生(试图调用函数重载)一些关于重载决策模糊性以及不做什么的事情. (2认同)