簡體   English   中英

在同一個類/結構中具有相同簽名的相同 function? 超載?

[英]Same function with same signatures in the same class/struct? Overload?

我在 boost 示例中看到了用於構建 state 機器的代碼部分。 讓我困惑的是這兩個成員函數ElapsedTime()? 這是否允許兩個函數具有相同的簽名,例如 function 名稱和參數類型?

我用谷歌搜索了很多但沒有找到相關信息。 對此的任何建議將不勝感激。

struct Active : sc::simple_state< Active, StopWatch, Stopped >
{
public:
    typedef sc::transition< EvReset, Active > reactions;

    Active() : elapsedTime_( 0.0 ) {}
    double ElapsedTime() const { return elapsedTime_; }
    double & ElapsedTime() { return elapsedTime_; }

private: 
    double elapsedTime_;
};

它們沒有相同的簽名 - 一個是const而另一個不是。 Constness是成員函數簽名的一部分。

函數的簽名由名稱和參數類型定義。 你有兩個具有相同名稱的函數,但它們沒有相同的參數!

你可能想知道它怎么可能?

因此,每個成員函數都隱式獲取另一個參數:這是“this”指針。 指向調用該方法的對象的指針。

在方法的末尾添加const時,將“this”參數指定為const的const指針 在另一個方法(沒有const)中,“this”的類型只是const指針

因此,您有兩種具有不同簽名的方法,並且根本沒有問題。

簽名是不同的,因為一個具有const限定符。 http://www.cprogramming.com/tutorial/const_correctness.html

這是允許的嗎

over.load#2.2狀態允許這種用法:

如果其中任何一個是 function 成員 function 聲明 ([class.static]),則不能重載具有相同名稱和相同參數類型列表的成員 function 聲明。 同樣,具有相同名稱、相同參數類型列表和相同模板參數列表的成員 function 模板聲明不能重載,如果它們中的任何一個是 static 成員 function 模板聲明。 為重載決策 ([over.match.funcs]) 的目的為成員函數構造的隱式 object 參數的類型在比較參數類型列表以執行此規則時不被考慮。 相反,如果在一組具有相同名稱和相同參數類型列表的成員 function 聲明中沒有成員 static 成員 function 聲明,則如果這些成員 function 聲明在其隱式 object 參數的類型不同,則可以重載. [示例:以下說明了這種區別:

(結束引用)

現在,在您的示例中,第一個重載具有const限定符,這意味着其隱式 object 參數的類型為const Active&而第二個重載沒有const限定符,這意味着其隱式 object 參數的類型為Active& 此外,沒有 static 成員 function 聲明具有相同的ElapsedTime -type-list 的 ElapsedTime。 因此,使用上面引用的語句,這意味着允許給定的用法。

筆記

請注意,當前接受的答案在技術上是不正確的,因為它聲稱this指向 const 的 const 指針 但實際上,標准規定const限定成員 function 中, this指針的類型為const X*而在非 const 限定成員 function 中, this指針的類型為X*

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM