我一直在阅读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重载。为了“强制”使用const重载,我必须获得指向vSignature函数的指针并将其转换为const重载。
除了上面的内容之外还有其他方法可以调用vSignature()const重载吗?
答案 0 :(得分:4)
除了上面的内容之外还有其他方法可以调用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
表达式涉及对象。
答案 1 :(得分:1)
不是真的。在任何情况下,函数的cv限定版本应该与非cv限定版本执行完全相同的事物,但是为了const正确性应该只是在那里。
答案 2 :(得分:0)
据我所知,const成员函数只在const对象上调用,所以如果你的对象是非const,它将调用非const函数。
答案 3 :(得分:0)
如果调用该函数的对象是const
,则将调用所需的函数:
((const Signature&)s).vSignature();
答案 4 :(得分:0)
选择的重载取决于表达式的类型,而不是对象的基础类型。因此,您只需使用强制转换添加const:
const_cast<Signature const&>(s).vSignature();
这具有额外的优势,读者可以轻松发现您正在做的事情。