C++ 如何使用C++;这个代码有效吗?
我有一个奇怪的代码。我一定是闭着眼睛敲打键盘,因为这类东西真的很蠢,但奇怪的是,我在程序成功运行后捕捉到了它 当然,main()中有更多的内容,Number也没有更多的成员和函数,但我认为这才是重要的 如果您查看main,您将看到add()被传递一个数字和一个无符号的long,但是add()只接受Number和Number 这是怎么回事C++ 如何使用C++;这个代码有效吗?,c++,C++,我有一个奇怪的代码。我一定是闭着眼睛敲打键盘,因为这类东西真的很蠢,但奇怪的是,我在程序成功运行后捕捉到了它 当然,main()中有更多的内容,Number也没有更多的成员和函数,但我认为这才是重要的 如果您查看main,您将看到add()被传递一个数字和一个无符号的long,但是add()只接受Number和Number 这是怎么回事 编辑:在上面添加了构造函数,因为Number有一个接受无符号long的构造函数,编译器正在从Number.getReverse()的返回值创建一个Number类
编辑:在上面添加了构造函数,因为
Number
有一个接受无符号long
的构造函数,编译器正在从Number.getReverse()
的返回值创建一个Number
类型的临时对象,并将其传递给add
函数。如果不希望发生这种隐式转换,则需要将Number
构造函数声明为explicit
,因为Number
有一个接受unsigned long
的构造函数,编译器正在从Number.getReverse()的返回值创建一个类型为Number
的临时对象
并将其传递给add
函数。如果不希望发生这种隐式转换,则需要将Number
构造函数声明为explicit
您将获得从long到Number的隐式转换。您也没有向我们显示所有代码或工作段。您得到了从long到Number的隐式转换。您也没有向我们展示您的所有代码或工作段。您遗漏了需要较长时间作为参数的构造函数
调用的第二个参数:
Number::add(Number,Number.getReverse())
正在转换为一个临时数字。您省略了与参数一样耗时的构造函数
调用的第二个参数:
Number::add(Number,Number.getReverse())
正在转换为临时数字。正如其他人所说,这是因为没有显式构造函数。有关为什么构造函数应该是显式的或不应该是显式的更多详细信息,正如其他人所说,这是因为您没有显式的构造函数。有关为什么构造函数应该显式或不显式的更多详细信息,请尝试使构造函数显式,看看它是否仍然可以编译。您是否忘记提到您有一个数字的c'tor?(例如Number::Number(long))在类之间进行隐式转换通常不是一个好主意。人们很容易对编译器选择的转换感到困惑。:-)试着让你的构造函数显式,看看它是否还能编译。你忘了提到你有一个数字的c'tor吗?(例如Number::Number(long))在类之间进行隐式转换通常不是一个好主意。人们很容易对编译器选择的转换感到困惑。:-)奇怪的东西。我会确保默认情况下显式标记构造函数。奇怪的东西。默认情况下,我将确保显式标记构造函数。
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;
}