如何使用cv限定符调用重载成员函数? 我一直在阅读C++标准,从那里我发现CV限定符是成员函数的函数签名的一部分。

如何使用cv限定符调用重载成员函数? 我一直在阅读C++标准,从那里我发现CV限定符是成员函数的函数签名的一部分。,c++,C++,考虑以下情况: /****************************** * Function signature testing *******************************/ class Signature { public: void vSignature( void ) { cout << "signature" << endl; } void vSignature(

考虑以下情况:

/******************************
* 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;
}
/******************************
*功能特征测试
*******************************/
类签名
{   
公众:
void v签名(void)
{

不可能。在任何情况下,函数的cv限定版本应该做与非cv限定版本完全相同的事情,但应该只是为了常量的正确性而存在。

不可能。在任何情况下,函数的cv限定版本应该做与非cv限定版本完全相同的事情,但应该是为了常量的正确性

除了上述方法外,还有其他方法调用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);
//首先
常量签名;
s、 vSignature();//调用常量函数
//第二
签名;
static_cast.vSignature();//调用const函数
//第三
无效f(常数签名和s)
{ 
s、 vSignature();//调用常量函数
}
签名;
f(s);
其思想是:
const
函数在
const
对象和涉及该对象的
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);
//首先
常量签名;
s、 vSignature();//调用常量函数
//第二
签名;
static_cast.vSignature();//调用const函数
//第三
无效f(常数签名和s)
{ 
s、 vSignature();//调用常量函数
}
签名;
f(s);

其思想是:
const
函数在
const
对象和涉及该对象的
const
表达式上被调用。

据我所知,const成员函数仅在const对象上被调用,因此,如果您的对象是非const,它将调用非const函数。

据我所知,const成员函数仅在在常量对象上调用,因此如果对象是非常量,它将调用非常量函数。

如果调用函数的对象是
const
,则将调用所需函数:

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

如果调用函数的对象是
const
,则将调用所需函数:

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

选择的重载取决于表达式的类型,而不是对象的基础类型。因此,您只需使用强制转换添加常量:

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

这还有一个额外的优点,读者可以很容易地发现你在做什么。

选择的重载取决于表达式的类型,而不是对象的基本类型。因此,你可以通过强制转换添加常量:

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

这还有一个额外的优点,读者可以很容易地发现你在做什么。

准确地说。你不应该以这样或那样的方式强制它。准确地说,你不应该以这样或那样的方式强制它。第二个例子不应该是
const\u cast吗
?@MSalters:Oops…我忘了那里的
const
关键字。至于
const\u cast
,static\u cast也会做同样的事情。对于非const对象,如果它是唯一的函数签名的话。@Nawaz,static\u cast也会做同样的事情,但是const\u cast不会变得更清晰/有目的/更狭窄?第二个例子不是应该吗le be
const_cast(s)
?@MSalters:Oops…我忘了那里的
const
关键字。至于
const\u cast
,静态\u cast也会做同样的事情。对于非常量对象,如果它是唯一的函数签名的话。@Nawaz,静态\u cast也会做同样的事情,但是const\u cast不会变得更清晰/有目的/更狭窄?我会选择静态\u cast在这种情况下,即使它做了相同的事情(与C样式转换相同),当有人决定更改
s
的类型时,它也可以防止不安全的转换。我在这里使用static_cast。即使它做了相同的事情(与C样式转换相同)在这种情况下,当有人决定更改
s
的类型时,它将防止不安全的强制转换。