簡體   English   中英

如何使用cv-qualifier調用重載成員函數?

[英]How do I call overloaded member function with cv-qualifier?

我一直在閱讀C ++標准,從那里我發現cv限定詞是成員函數的函數簽名的一部分。

考慮以下情況:

/******************************
* Function signature testing
*******************************/
class Signature
{   
public:
    void vSignature( void )
    {
        cout << "signature" << endl;        
    }

    void vSignature( void ) const 
    {
        cout << "constant signature" << endl;
    }
};

typedef void (Signature::*constFunc)( void ) const ;
int main(void)
{
    constFunc f = &Signature::vSignature;
    Signature s;
    s.vSignature();  //outputs 'signature'
    (s.*f)();        // outputs 'constant signature'
    return 0;
}

在上面的代碼中,當我以“普通”方式調用vSignature時,將調用非常量重載。 為了“強制”使用const重載,我必須獲得指向vSignature函數的指針,並將其強制轉換為const重載。

除了上述方法以外,還有其他方法可以調用vSignature()const重載嗎?

除了上述方法以外,還有其他方法可以調用vSignature()const重載嗎?

是。 你可以這樣做:

//first 
const Signature s;
s.vSignature(); //calls const function

//second
Signature s;
static_cast<const Signature &>(s).vSignature(); //calls const function

 //third
 void f(const Signature &s)
 { 
      s.vSignature(); //calls const function
 }

 Signature s;
 f(s);

這個想法是: const函數在const對象和涉及該對象的const表達式上被調用。

並不是的。 無論如何,函數的cv限定版本應與非cv限定版本完全相同 ,但出於const正確性的考慮而應存在。

據我了解,const成員函數僅在const對象上調用,因此,如果您的對象是非const,它將調用非const函數。

如果調用該函數的對象是const則將調用所需的函數:

((const Signature&)s).vSignature();

選擇的重載取決於表達式的類型,而不是對象的基礎類型。 因此,您可以只在const后面加上強制類型轉換:

const_cast<Signature const&>(s).vSignature();

這具有額外的優勢,即讀者可以輕松發現您正在做什么。

暫無
暫無

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

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