【问题标题】:Cannot call a method of const reference parameter in C++无法在 C++ 中调用 const 引用参数的方法
【发布时间】:2015-05-13 07:39:39
【问题描述】:
class A
{
public:
    A(){};
    ~A(){};
    void method(){};

};

void call(const A &a)
{
    a.method();   // I cannot call this method here if I use "const" but I can call it if not using "const"
}

int main()
{
    A a;
    call(a);
    return 0;
}

在这种情况下,错误是:“passing const A as this argument of void A::method() discards qualifiers [-fpermissive]|

在函数call 中,如果我使用const,我会得到错误,但如果我摆脱它,它会起作用。

谁能帮我解释一下?

【问题讨论】:

  • What is a “const member function”?。另外,在成员函数定义之后不需要;
  • 你认为const 有什么作用?
  • @JonathanWakely 感谢您的回答,但此规则不适用于此链接中提到的重载运算符 [],您能为我解释更多吗? pastebin.com/1mKek7pM 很抱歉给您带来不便。我其实不知道如何在这个评论区创建代码块。
  • @LightnessRacesinOrbit 据我所知,它确保我们无法更改对象的任何内容。我尝试了规则“void method() const {};”用于重载运算符 [] 但我不起作用。你能给我解释一下吗?这是代码:pastebin.com/1mKek7pM
  • @MrCold:代码不起作用的唯一原因是您在随机添加的operator[] 中有一个错误,与此问题无关。当你试图解决问题时,试着一次只改变一件事。如果您const 添加到method(),您会发现它工作正常。

标签: c++ function class methods constants


【解决方案1】:

您不能通过 const 引用调用非 const 成员函数。你可以通过创建成员函数const来解决这个问题:

void method() const {};
              ^^^^^

这表明调用成员不会改变调用它的对象*

* 从概念上讲。在实践中,它可以改变标记为mutable的成员

【讨论】:

  • 感谢您的回答,但我认为此规则不适用于重载运算符 [],如下所示:pastebin.com/1mKek7pM 您能解释更多吗?
  • @MrCold “这条规则不起作用”是什么意思?你的意思是它不编译?那是因为您通过对对象的 const 引用返回对数据成员的非常量引用。
  • @MrCold 换句话说,const 重载应该返回一个const 引用(或一个值):const int& operator [] (int i) const {return num;}。当您希望能够修改数据成员时,您还可以添加非常量重载:int& operator [] (int i) {return num;}
  • 哦,我明白了。非常感谢您的解释:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-02
  • 1970-01-01
  • 1970-01-01
  • 2015-03-21
  • 2016-10-29
相关资源
最近更新 更多