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

时间:2011-04-07 05:40:42

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

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

如果查看main,您会看到add()传递的是Number和unsigned long,但add()只接受Number和Number。

这里发生了什么?

编辑:在

上面添加了构造函数

4 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

你遗漏了以long为参数的构造函数。

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

答案 3 :(得分:1)

正如其他人所说,这是因为你没有明确的构造函数。有关构造函数应该显式的原因的更多详细信息,请see this SO question