我有一些奇怪的代码.我一定是闭着眼睛打我的键盘,因为这种类型的东西真的很愚蠢,但奇怪的是,我在程序成功运行后抓住了它.
Run Code Online (Sandbox Code Playgroud)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从返回值创建一个类型的临时对象number.getReverse()并将其传递给add函数.如果您不希望发生此类隐式转换,则需要将Number构造函数声明为explicit.