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

标签 c++ pointers reference overloading sqrt

所以我有这个作业要做“使用函数重载定义 3 个具有相同名称但具有不同 prams 类型(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));
}

最佳答案

鉴于这些声明:

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

另请注意,即使使用像 a 这样的命名变量,也可以调用 (1)(3),但我们可以' 依靠重载决议来做到这一点。我们必须明确地告诉编译器我们想要哪个函数。为此,我们必须输入名称:

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

关于c++重载具有不同参数的3个函数(int,* int,& int),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35819949/

相关文章:

c++ - C++中成对的指针

c - 将 2D 数组指针传递给 C 中的函数

c - 为什么通过引用调用的函数在从 mex 包装器中的其他源文件链接时不起作用?

c# - 从表中获取值作为引用

c++ - RegisterClassEx 在 64 位上参数无效(但在 32 位上工作)

c++ - 如何让基方法只在派生类没有定义同名方法的情况下定义

c++ - 在构造函数中分配数组时出错

c++ - 我可以避免在一系列函数调用中使用模板消歧器吗?

c - 指针和分配问题

c++ - C++ 类上下文中的引用和指针