下面有一个课程
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();
}
因为添加了一个新的临时值,* this和temp之间的内部状态不同(* this!= temp)。
它可以像我描述的那样被调用吗?
答案 0 :(得分:2)
正如 How do I remove code duplication between similar const and non-const member functions? 中提到的,避免代码重复的解决方案是将逻辑放在const方法中(假设您不需要修改对象状态或您修改的成员是mutable)并从非const one调用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
}
};
答案 1 :(得分:0)
通过创建方法const
,您正在向消费者承诺(松散地)该方法不会对对象进行任何更改。如果您的非const
版本对对象进行了更改,则无法在const
方法中调用它。 当前对象是否为常量无关紧要。如果您的非const
方法未对对象进行更改,请将其设为const
。
答案 2 :(得分:0)
getStr() const
无法致电getStr()
(非const
)。
const
函数可以由非const
函数调用。一直发生。这是因为只能使用const
指针调用const this
函数。在非const
函数中,this
指针也是非const
,但它可以很容易地转换为const
指针。反之则不然 - 你不能(轻易/正确地)抛弃const
指针的const
。因此,在非const
方法中,您可以调用其他const
方法。
答案 3 :(得分:-1)
A类中的函数getStr
返回局部变量的引用。更重要的是,它与第二个功能是同一个问题。