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真正想要什么,代码太短了。我认为我们应该假设他有理由去做他想做的事情,除非从代码中可以清楚地看出他做错了什么。谢谢你修正了你的答案。我猜否决票是