在C ++中调用const实例上的非const函数是可能的吗?

时间:2018-01-18 23:27:00

标签: c++ const

我已经得到了以下这段代码,

#include <iostream>
#include <string>
using namespace std;

class Foo {
 public:
  void print() { cout << "hello\n"; }
}
  ;

Foo get_foo() {
  Foo f;

  return f;
}
int main()
{
   // If I get rid of this "const", then the error goes away
   const Foo f = get_foo();

  f.print();

  return 0;

}

当我编译它时,它给了我这个错误

test.cc:21:11: error: passing ‘const Foo’ as ‘this’ argument discards qualifiers [-fpermissive]                                
  f.print();         

我尝试删除&#34; const&#34;在f的声明中,代码将被编译。

但我不明白这个限制。 有人可以解释一下吗? 我怎么称呼&#34; print()&#34;没有删除&#34; const&#34;来自该领域的宣言?

编辑:&#34; Foo&#34;上面添加的课程纯粹是出于演示目的。在我的真实代码中,我无法编辑课程,但我想制作的原因是&#34; f&#34; const是出于​​代码风格/安全原因。

1 个答案:

答案 0 :(得分:2)

  

&#34; Foo&#34;上面添加的课程纯粹是出于演示目的。在我的真实代码中,我无法编辑课程,但我想制作的原因是&#34; f&#34; const是出于​​代码风格/安全原因。

void print() { cout << "hello\n"; }

并未声明为const的{​​{1}}成员函数,而您无法改变这一点,您将不得不吞下那个糟糕的设计,并访问{{ 1}}通过非Foo实例或引用来运行。

要做到这一点,需要在print()类中声明const,如

print()

我同意更好的代码样式是允许使用Foo void print() const { cout << "hello\n"; } // ^^^^^ print()实例调用const函数。

但正如你所提到的,如果你无法改变,那么除了使用明确的演员之外别无他法:

Foo

无论如何,除了简单的电话之外,还没有额外的&#34;安全&#34;

const_cast<Foo&>(f).print();