【问题标题】:programming in c++ basic thing用 C++ 编程基本的东西
【发布时间】:2012-11-26 16:59:25
【问题描述】:

我有一个简单的问题,因为我没有正确理解该功能。 有这样的代码:

int function(a, b)
{
 return a*b;
}

我很清楚,如果 a 和 b 是 int ,那么它会返回结果。 但是有这样的:

int function1(arg1, arg2)
{
 //something
 if (B)
 {
  //do something
  return;
  }
 arg1[0] = variable1;
 arg1[1] = variable2;
 arg2 = variable3;
 return;
}

我想命名接口,输入和输出,并将函数体放入“黑盒”。输入是函数的参数,我正确吗?那么输出是整数数组arg1和整数arg2,对吗?如果是这样,如何输出输入,或者如果我错了如何识别它? 另外,如果 B 为真,在返回点会发生什么? function1 什么都不返回吗?如果是这样,为什么不是 void 类型? 抱歉有点混乱和这样有趣的例子,但多亏了这个,我才能理解这个概念。

【问题讨论】:

  • 不清楚你想说什么。什么是黑盒?
  • 你的函数参数没有类型。这是伪代码吗?
  • 我认为他对 C/C++ 中的习语感到困惑,其中一些输入被修改,因此也是“输出”而不是返回类型的单个输出
  • 您是否尝试过编译一些看起来像这样的实际 C++ 代码?我有 72% 的把握,如果你说你要返回一个 int(至少在 main 之外),编译器不会让你什么都不返回。
  • 首选不修改任何内容并通过return 语句返回结果的函数。当您需要修改过于昂贵或不方便复制到函数并返回的值时,通过引用传递。在你学习更多的语言之前完全避免使用指针(甚至更喜欢智能指针而不是原始指针)。

标签: c++ function return


【解决方案1】:

这段代码实际上是无效的C++:

int function(a, b)
{
 return a*b;
}

这是无效的,因为函数参数必须有类型,而ab 没有指定类型。这将是有效的:

int function(int a, int b)
{
 return a*b;
}

如果你想设计一个可以接受未指定类型参数的函数,你可以使用模板:

template<class Val>  Val function(Val a, Val b)
{
  return a*b;
}

这适用于任何类型(例如 int),只要该类型在与 operator*a*b 一起使用时有意义。例如,std::string 将不起作用。

在 C++ 中,所有声明为返回类型的函数都必须在每个返回点返回该类型。这使得这段代码也无效:

int function1(arg1, arg2)
{
 //something
 if (B)
 {
  //do something
  return;
  }
 arg1[0] = variable1;
 arg1[1] = variable2;
 arg2 = variable3;
 return;
}

您不能从声明为返回int 的函数返回void。如果你需要从一个声明为返回值的函数中“转义”,你可以抛出一个异常:

int function1(arg1, arg2)
{
 //something
 if (B)
 {
  //do something
  throw std::runtime_error("whoops");
  }
 arg1[0] = variable1;
 arg1[1] = variable2;
 arg2 = variable3;
 throw std::runtime_error("whoops 2");
}

但是,鉴于此问题的上下文,我怀疑这不是您正在寻找的内容,您现在应该将例外视为高级主题。这些不是你要找的机器人。

【讨论】:

  • 我有一些 c++ 知识,从某种意义上说,我知道模板的用法。我现在对输入输出有点困惑,当我有这么多返回时,有些嵌套在 if 的条件中。你能告诉我在这种情况下如何把 trycatch 部分的异常?如果我做对了,在完全填充的 B 条件下会抛出 whoops 并且它会跳出 function1 ... 到 catch 所在的位置,还是 try 所在的位置?
  • 真的不认为例外是这里工作的正确工具,因为我了解您要完成的工作。但是,要回答您的问题,您可以在 try 块中包围对 function 的调用,然后立即使用一系列 catch 块。再说一次,我真的怀疑这是你需要的。
【解决方案2】:

如果 B 为真,则函数在输出数组被填充之前返回,但您仍然需要返回 something,因为该函数具有“int”返回类型。

至于参数是输入参数还是输出参数,由你决定。但是,C++ 中的约定是输入参数是 const(如果它们是指针或引用),如果它们是输出参数,则为非 const:

int function1(const int* arg1, int* arg2) // arg1 is an in param, arg2 is an out param

【讨论】:

  • 谢谢!我可以确定在这种情况下读取 function1 参数我可以构建我的输入和输出接口吗?因为我认为一个函数也可以修改一些不在参数中的全局变量。是这样吗?
猜你喜欢
  • 2015-04-28
  • 2011-05-24
  • 2013-11-12
  • 2021-02-07
  • 1970-01-01
  • 2011-04-10
  • 2013-08-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多