Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用C++;这个代码有效吗?_C++ - Fatal编程技术网

C++ 如何使用C++;这个代码有效吗?

C++ 如何使用C++;这个代码有效吗?,c++,C++,我有一个奇怪的代码。我一定是闭着眼睛敲打键盘,因为这类东西真的很蠢,但奇怪的是,我在程序成功运行后捕捉到了它 当然,main()中有更多的内容,Number也没有更多的成员和函数,但我认为这才是重要的 如果您查看main,您将看到add()被传递一个数字和一个无符号的long,但是add()只接受Number和Number 这是怎么回事 编辑:在上面添加了构造函数,因为Number有一个接受无符号long的构造函数,编译器正在从Number.getReverse()的返回值创建一个Number类

我有一个奇怪的代码。我一定是闭着眼睛敲打键盘,因为这类东西真的很蠢,但奇怪的是,我在程序成功运行后捕捉到了它

当然,main()中有更多的内容,Number也没有更多的成员和函数,但我认为这才是重要的

如果您查看main,您将看到add()被传递一个数字和一个无符号的long,但是add()只接受Number和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;
}