C++ 如何在C+中的常量重写函数中调用非常量函数+;
下面有一节课C++ 如何在C+中的常量重写函数中调用非常量函数+;,c++,overriding,call,constants,C++,Overriding,Call,Constants,下面有一节课 class A { public: string& getStr() { // Do a lot of work to get str return str } const string& getStr() const; }; 我可以在第二个函数中调用第一个函数吗?我想这样做,因为第二个函数与第一个函数有很多相同的代码。不可能是这样的: const st
class A
{
public:
string& getStr()
{
// Do a lot of work to get str
return str
}
const string& getStr() const;
};
我可以在第二个函数中调用第一个函数吗?我想这样做,因为第二个函数与第一个函数有很多相同的代码。不可能是这样的:
const string& A::getStr() const
{
// Wrong
A temp;
return temp.getStr();
}
因为添加了一个新的temp,*this和temp之间的内部状态不同(*this!=temp)
可以像我描述的那样调用它吗?类A中的函数
getStr
返回局部变量的引用。此外,第二个函数也是同样的问题。类A中的函数getStr
返回局部变量的引用。更重要的是,第二个函数也有同样的问题。如中所述,避免代码重复的解决方案是将逻辑放在const方法中(假设不需要修改对象状态或修改的成员是可变的),并从非const方法调用const方法:
class A
{
public:
string& getStr()
{
return const_cast<string&>( static_cast<const A *>( this )->getStr() );
}
const string& getStr() const {
// Do a lot of work to get str
return str
}
};
A类
{
公众:
string&getStr()
{
返回常量转换(静态转换(this)->getStr());
}
常量字符串&getStr()常量{
//做很多工作来获得str
返回str
}
};
如中所述,避免代码重复的解决方案是将逻辑放在const方法中(假设不需要修改对象状态或修改的成员是可变的),并从非const方法调用const方法:
class A
{
public:
string& getStr()
{
return const_cast<string&>( static_cast<const A *>( this )->getStr() );
}
const string& getStr() const {
// Do a lot of work to get str
return str
}
};
A类
{
公众:
string&getStr()
{
返回常量转换(静态转换(this)->getStr());
}
常量字符串&getStr()常量{
//做很多工作来获得str
返回str
}
};
通过创建一个方法const
您向消费者承诺(不严格地)该方法不会对对象进行任何更改。如果非const
版本对对象进行了更改,则无法在const
方法中调用该对象当前对象是否为常量并不重要。如果您的非const
方法未对对象进行更改,则通过创建方法const
使其成为const,您向消费者承诺(不严格地)该方法不会对对象进行任何更改。如果非const
版本对对象进行了更改,则无法在const
方法中调用该对象当前对象是否为常量并不重要。如果非常量
方法未对对象进行更改,则使其常量
getStr()常量
无法调用getStr()
(非常量
)
const
函数可以由非const
函数调用。这种事经常发生。这是因为const
函数只能用const This
指针调用。在非常量
函数中,此
指针也是非常量
,但它可以轻松转换为常量
指针。反之亦然——您不能(轻松/正确地)丢弃常量的属性。因此,在一个非const
方法中,您可以调用其他的const
方法。getStr()const
不能调用getStr()
(非const
)
const
函数可以由非const
函数调用。这种事经常发生。这是因为const
函数只能用const This
指针调用。在非常量
函数中,此
指针也是非常量
,但它可以轻松转换为常量
指针。反之亦然——您不能(轻松/正确地)丢弃常量的属性。因此,在非const
方法中,您可以调用其他const
方法。查看旁注。如果str
是一个局部变量(如上面代码段所示),那么string&getStr()
将返回对局部变量的引用。别这样!改为按值返回。那里有一点代码味道。。。什么是//大量工作
?这项工作是否会更新对象的成员,然后返回对该成员的引用?它是否创建并更新局部变量?在这两种情况下,设计看起来都是错误的,请看一看旁注。如果str
是一个局部变量(如上面代码段所示),那么string&getStr()
将返回对局部变量的引用。别这样!改为按值返回。那里有一点代码味道。。。什么是//大量工作
?这项工作是否会更新对象的成员,然后返回对该成员的引用?它是否创建并更新局部变量?在任何一种情况下,设计看起来都是错误的。我怀疑问题中是否有足够的信息来声明“str”是局部变量。当使用“getStr”函数获取字符串时,它将得到一个空字符串。我怀疑问题中是否有足够的信息来声明“str”是局部变量。当使用“getStr”函数获取字符串时,它将得到一个空字符串。我假设下一票支持getter应该是const
?编写非const getter的观点。想象一下容器,其中const方法返回const引用,non-const方法返回non-const引用,但逻辑是相同的。够好吗?@Slava:好吧,够公平了。@Slava:但这并不是OP想要的。有些东西仍然感觉不对劲。很难说OP真正想要什么,代码太短了。我认为我们应该假设他有理由去做他想做的事情,除非从代码中可以清楚地看出他做错了什么。谢谢你修正了你的答案。我猜否决票是