簡體   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