繁体   English   中英

函数重载只能通过C ++中的返回值和const来完成?

[英]function overloading can only be done by return value and const in C++?

除了返回类型和常量之外,是否可以使用相同函数的两个版本?

我不这么认为。 以下示例显示了这一点。 但我不知道原因。

#include<iostream>
using namespace std;
class A
{
 private:
       int bb ;
 public:
       double f1(int a) const {cout << "double f1 is called " << endl; return 0.0; }
       int f1(int a) {cout << "int f1 is called " << endl ; return 0; }

};

int main()
{
     int b = 6;
     A aa;

     double c= aa.f1(b);
     return 0 ;
}

输出:

int f1被调用

为什么双f1(int a)const不能计算?

出于显而易见的原因,您不能在返回类型上重载。

但是,您可以重载隐式实例参数的常量。 相比:

aa.f1(b);
static_cast<A const &>(aa).f1(b);

(这个例子也说明了为什么尝试“在返回类型上重载”没有意义:在这个例子中你会如何做出决定?)

我想主要的问题是它容易引入歧义。 例如:

int main()
{
  int b = 6;
  A aa;

  float c= aa.f1(b); // which version of f1 is called here?
  return 0 ;
}

它是int版本并且值被提升为float,还是双版本并且值被截断?

一种可能的解决方案是将返回值移动到引用参数:

void f1(int a, double &out);
void f1(int a, int &out);

然后,如果没有匹配类型,编译器可以确定要调用哪一个或生成错误。

我同意Skizz,这里的歧义是不安全的。 在你给出的例子中,我们永远不知道最后会调用哪两个方法(甚至想知道它是否依赖于编译器?)。

就我而言,在C ++中创建具有相同名称但不同const的成员函数的主要兴趣是在成员数据上创建const /非const访问器。

例:

class Foo {
    private: Data m_Data;

    public: Data& getData(void) { return m_Data; }
    public: const Data& getData(void) const { return m_Data; }
};

两个访问器getData()都检索成员属性m_Data的引用。 当您在可修改的Foo实例上进行调用时,第一个返回可修改的数据。 第二个在const Foo实例上调用时返回一个const数据。

否则,我会建议避免这种设计。

此致,

除非您将返回类型声明为常见的超类型,例如void *,然后将结果转换回您需要的内容。 这当然是非常邪恶的。

您可以考虑将返回类型包装在一个对象中,该对象可以很聪明地包含哪种解决方案。 这就是大多数OO系统最终经常做的事情,这是封装可能如此有用的一个原因。

这也是仿制药如何令人敬畏的。 我必须检查我的C ++语法,但是您可以声明一个函数,其返回类型与其参数类型相关,或者基于子类的泛型。

但是对于基类型,不,不是真的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM