这段代码的C++是如何工作的?

ete*_*att 1 c++

我有一些奇怪的代码.我一定是闭着眼睛打我的键盘,因为这种类型的东西真的很愚蠢,但奇怪的是,我在程序成功运行后抓住了它.

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;
}
Run Code Online (Sandbox Code Playgroud)

当然,main()中有更多的东西在进行,而Number有更多的成员和功能,但这是我认为重要的.

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

这里发生了什么?

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

Nav*_*een 5

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