如何使用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 beconst_cast(s)
?@MSalters:Oops…我忘了那里的const
关键字。至于const\u cast
,静态\u cast也会做同样的事情。对于非常量对象,如果它是唯一的函数签名的话。@Nawaz,静态\u cast也会做同样的事情,但是const\u cast不会变得更清晰/有目的/更狭窄?我会选择静态\u cast在这种情况下,即使它做了相同的事情(与C样式转换相同),当有人决定更改s
的类型时,它也可以防止不安全的转换。我在这里使用static_cast。即使它做了相同的事情(与C样式转换相同)在这种情况下,当有人决定更改s
的类型时,它将防止不安全的强制转换。