如何在C ++中的const覆盖函数中调用no-const函数

时间:2013-10-03 15:08:43

标签: c++ override call const

下面有一个课程

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)。

它可以像我描述的那样被调用吗?

4 个答案:

答案 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返回局部变量的引用。更重要的是,它与第二个功能是同一个问题。