在C ++函数头中初始化变量

时间:2011-05-13 09:08:40

标签: c++ function variables prototype initialization

我遇到过一些看起来像这样的C ++代码(本帖简化):

(这是位于someCode.hpp

中的函数原型
void someFunction(const double & a, double & b, const double c = 0, const double * d = 0);

(以下是位于someCode.cpp #include someCode.hpp}

void someFunction(const double & a, double & b, const double c, const double * d); 函数体的第一行
someFunction

我可以合法地使用以下方式致电someFunction(*ptr1, *ptr2);

someFunction(*ptr1, *ptr2, val1, &val2);

和/或

ptr1

已正确定义变量ptr2valval2val1,且val2和{{1}}不等于零?为什么或为什么不呢?

如果它是合法的,这种语法是否优先于重载函数以考虑可选参数?

4 个答案:

答案 0 :(得分:5)

是的,这是合法的,这称为default arguments。我会说由于涉及的代码较少而优先考虑重载,是的。

关于const的评论,这不适用于默认值本身,它适用于参数。如果你有一个const char* fruit = "apple"类型的参数,那并不意味着必须用一个字符指针调用它的值与"apple"字符串文字的地址相同(这很好,因为这很难保证)。它只是意味着必须使用指向常量字符的指针来调用它,并告诉您被调用的函数不需要写入该内存,只能从中读取。

答案 1 :(得分:1)

是的,参数是可选的,当你没有传递它们时,将使用给定的默认值。

使用默认参数值而不是重载有一些优点和缺点。优点是在界面和实现部分中输入较少。但缺点是默认值是界面的一部分及其所有后果。然后,当您更改默认值时,您需要在使用重载时重新编译大量代码而不是单个文件。

我个人更喜欢默认参数。

答案 2 :(得分:1)

我想对默认参数是否优先于重载进行扩展。

通常它们是出于其他答案中给出的所有原因,最明显的是更少的样板代码。

在某些情况下,还有一些有效的理由可以使重载成为更好的选择:

默认值是界面的一部分,更改可能会破坏客户端(正如@Juraj已经注意到的那样) 此外,Overloads可以更轻松地添加其他(组合)参数,而不会破坏(二进制)接口。

在编译时解决了重载,这可以为编译器提供更好的优化(esp inlining)可能性。例如如果您有这样的事情:

void foo(Something* param = 0) {
   if (param == 0) {
      simpleAlgorithm();
   } else {
      complexAlgorithm(param);
   }
}

使用重载可能更好。

答案 3 :(得分:0)

  

我可以使用以下方式合法地调用someFunction:

     

someFunction(* ptr1,* ptr2);

绝对!是的,函数接受的其他2个变量将具有您在头文件中设置的默认值,这两个参数都为零。

但是如果你确实为函数提供了第3个和第4个参数,则会考虑这些值而不是默认值。