C ++函数重载中出现意外行为

时间:2017-01-05 18:21:12

标签: 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;
}

输出显示如下。

Inside 2 
Inside 2 
Inside 3 
Inside 3

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

1 个答案:

答案 0 :(得分:5)

  

for&#34; const int&amp; tmp2 = myClass1.get();&#34;我预计它将打印调用&#34; const int&amp; get()const&#34;在MyClass1中。

你不能解释为什么会这样,但你当然不应该这样。有两个get函数不带参数,一个const而另一个不{。}}。由于myClass1不是const,因此调用非const的函数。

如果不是这样,那么允许具有相同名称的两个类成员函数并采用相同参数的区别仅在于const而另一个不是{0}}是没有意义的。