我有一些奇怪的代码。我一定是闭着眼睛打我的键盘,因为这种类型的东西真的很愚蠢,但奇怪的是,我在程序运行成功后抓住了它。
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。
这里发生了什么?
编辑:在
上面添加了构造函数答案 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