这些代码是如何在c++中工作的

How C++ is this code working?

本文关键字:c++ 工作 代码      更新时间:2023-10-16

我有一段奇怪的代码。我一定是闭着眼睛敲键盘了,因为这种事情真的很愚蠢,但奇怪的是,我在程序成功运行后发现了它。

struct Number{
private:
  unsigned long longNumber;
public:
   Number(unsigned long n)
   {
      longNumber = n;
   }
  unsigned long getReverse()
  {
      /*some magic that returns an unsigned long */
  }
  inline
  unsigned long getLong()
  {
      return longNumber;  
  }
  inline
  static Number add(Number one, Number two)
  {
      return Number(one.getLong() + two.getLong());
  }
};

int main()
{
  scanf("%lu", n);
  Number number = Number(n);
  number = Number::add(number, number.getReverse());
  return 0;
}

当然main()中有更多的东西,Number中有更多的成员和函数,但我认为这是最重要的。

如果你查看main,你会看到add()被传递了一个Number和一个unsigned long,但是add()只接受Number和Number。

这是怎么回事?

编辑:在上面添加构造函数

由于Number有一个接受unsigned long的构造函数,编译器从number.getReverse()的返回值创建一个Number类型的临时对象并将其传递给add函数。如果不希望发生这种隐式转换,则需要将Number构造函数声明为explicit

您将获得从long到Number的隐式转换。您也没有向我们展示您的所有代码或工作段。

您忽略了接受long作为实参的构造函数

调用Number::add(number, number.getReverse())的第二个参数正在被转换为临时数字

正如其他人所说,这是因为您没有显式构造函数。有关构造函数为什么应该显式或不显式的更多细节,请参阅这个问题