[英]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.