C++ C++;无法删除递归中对象的常量
我有下面的功能C++ C++;无法删除递归中对象的常量,c++,constants,const-cast,C++,Constants,Const Cast,我有下面的功能 class p{ public : string const& PrintData() const { cout << "const" << str; const_cast<ConstFunctions *>(this); PrintData(); return str; } string const& PrintData() { cout << "non-const" <
class p{
public :
string const& PrintData() const
{
cout << "const" << str;
const_cast<ConstFunctions *>(this);
PrintData();
return str;
}
string const& PrintData()
{
cout << "non-const" << endl;
return str;
}
private :
string str="Hello";
}
int main()
{
const p p1;
p1.PrintData();
}
p类{
公众:
字符串常量&PrintData()常量
{
coutp1
是const
,因此它调用:
string const& PrintData() const
在这个函数中,您调用PrintData
,但由于您在const
函数中,编译器将调用const
版本,这将导致递归循环
该行:
const_cast<ConstFunctions *>(this);
const_cast(本);
实际上不做任何事情,因为您的类在其类型层次结构中没有此类型,而且您也没有对中进行任何操作
如果确实要调用非常量版本,请执行以下操作:
const_cast<p*>(this)->PrintData();
const_cast(this)->PrintData();
但你真的应该问问自己为什么要这么做…p1
是const
,所以它调用:
string const& PrintData() const
在这个函数中,您调用PrintData
,但由于您在const
函数中,编译器将调用const
版本,这将导致递归循环
该行:
const_cast<ConstFunctions *>(this);
const_cast(本);
实际上不做任何事情,因为您的类在其类型层次结构中没有此类型,而且您也没有对中进行任何操作
如果确实要调用非常量版本,请执行以下操作:
const_cast<p*>(this)->PrintData();
const_cast(this)->PrintData();
但是你真的应该问问自己为什么要这样做…语句const\u cast(this);
没有做任何有用的事情。它执行const\u cast
并简单地丢弃结果。编译器很可能会优化它
然后执行递归调用,它只调用自身,而不是非常量函数
你可能是有意的
const_cast<p*>(this)->PrintData();
const_cast(this)->PrintData();
语句const_cast(this);
没有任何用处。它执行const_cast
并简单地丢弃结果。编译器很可能会对其进行优化
然后执行递归调用,它只调用自身,而不是非常量函数
你可能是有意的
const_cast<p*>(this)->PrintData();
const_cast(this)->PrintData();
这一行
string const& PrintData() const
{
cout << "const" << str;
const_cast<ConstFunctions *>(this); //It doesn't work this way, you didn't use the result
PrintData(); //THis causes a recursive loop
return str;
}
this
指针始终携带调用对象的cv
限定。请参阅
您要做的是抛弃this
的cv
限制,并使用生成的this
调用非常量版本
string const& PrintData() const
{
cout << "const" << str;
return const_cast<p*>(this)->PrintData();
}
string常量和PrintData()常量
{
这条线
string const& PrintData() const
{
cout << "const" << str;
const_cast<ConstFunctions *>(this); //It doesn't work this way, you didn't use the result
PrintData(); //THis causes a recursive loop
return str;
}
this
指针始终携带调用对象的cv
限定。请参阅
您要做的是抛弃this
的cv
限制,并使用生成的this
调用非常量版本
string const& PrintData() const
{
cout << "const" << str;
return const_cast<p*>(this)->PrintData();
}
string常量和PrintData()常量
{
cout“编译器很可能会优化掉它。”编译器绝对会“优化掉它”,因为它实际上无法为该语句创建有意义的代码。它在翻译的/“编译”程序中没有类似的代码。或者const_cast(this)->PrintData()
实际上(不知道ConstFunctions
是什么)如果我想永久删除对象的恒定性怎么办?有可能吗?@raghureddy这是不可能的。感谢您的快速响应。我将对此做更多的研究“编译器很可能会优化它”。编译器绝对会“优化它”,因为它实际上无法为该语句创建有意义的代码。它在翻译的/“编译”程序中没有类似的代码。或者const_cast(this)->PrintData()
实际上(不知道ConstFunctions
是什么)如果我想永久移除物体的恒常性呢?有可能吗?@raghureddy这是不可能的。谢谢,谢谢你的快速反应。我会对此做更多的研究。谢谢,这非常有帮助。谢谢,这非常有帮助。谢谢,这非常有帮助。谢谢,这非常有帮助。