C++函数重载中的意外行为

Soo*_*Soo 2 c++ overloading

请考虑以下代码.

class MyClass1
{
public:
  MyClass1(const int& i)
  {
    myVar = i;
  }

  const int& get() const
  {
    std::cout<<"Inside 1 \n";
    return myVar;
  }

  int get()
  {
    std::cout<<"Inside 2 \n";
    return myVar;
  }

private:
    int myVar;
};

class MyClass2
{
public:
  MyClass2(const int& i)
  {
    myVar = i;
  }

  const int& get()
  {
    std::cout<<"Inside 3 \n";
    return myVar;
  }

  int get() const
  {
    std::cout<<"Inside 4 \n";
    return myVar;
  }

private:
    int myVar;
};


int main(int argc, char* argv[])
{

  MyClass1 myClass1(10);
  int tmp1 = myClass1.get();
  const int& tmp2 = myClass1.get();


  MyClass2 myClass2(10);
  int tmp3 = myClass2.get();
  const int& tmp4 = myClass2.get();

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出显示如下.

Inside 2 
Inside 2 
Inside 3 
Inside 3
Run Code Online (Sandbox Code Playgroud)

对于"const int&tmp2 = myClass1.get();" 我希望它会在MyClass1中打印调用"const int&get()const".令我惊讶的是,它在MyClass1的两个案例中都称为"int get()".在MyClass2中,我交换了"const"然后我发现在函数调用中它称为"const int&get()".为什么会这样?

Dav*_*rtz 5

对于"const int&tmp2 = myClass1.get();" 我希望它会在MyClass1中打印调用"const int&get()const".

你没有解释为什么你期望这个,但你当然不应该.有两个get函数不带参数,一个不带参数const.既然myClass1不是const,则调用不是的函数const.

如果不是这样的话,那么允许两个具有相同名称的类成员函数并使用相同的参数只是因为一个是const另一个而不是另一个而没有意义.