1

下面有课

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

可以像我描述的那样称呼它吗?

4

4 回答 4

2

如何删除相似的 const 和非 const 成员函数之间的代码重复?,避免代码重复的解决方案是将逻辑放在 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
      }
};
于 2013-10-03T15:26:38.697 回答
0

通过创建一个方法const,您向消费者(松散地)承诺该方法不会对对象进行任何更改。如果您的非const版本对对象进行了更改,则无法在const方法中调用它。当前对象是否为 const 并不重要。如果您的非const方法没有对对象进行更改,则 make it const

于 2013-10-03T15:28:28.993 回答
0

getStr() const不能调用getStr()(非const)。

const但是,函数可以由非const函数调用。无时无刻不在发生。这是因为const函数只能用const this指针调用。在非const函数中,this指针也是非const-,但它可以很容易地转换为const指针。反过来是不正确的——你不能(容易/正确地)抛弃指针的const本质。const因此,您可以从非const方法中调用其他const方法。

于 2013-10-03T15:32:10.467 回答
-1

A 类中的函数getStr返回一个局部变量的引用。更重要的是,第二个函数也是同样的问题。

于 2013-10-03T15:14:56.953 回答