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