2011-05-13 114 views
4

我已经遇到了一些C++代码看起来像这样(简化为这个职位):在C++函数头初始化变量

(这里是位于someCode.hpp函数原型)

void someFunction(const double & a, double & b, const double c = 0, const double * d = 0); 

(这里的函数体的第一行位于someCode.cpp#includesomeCode.hpp

void someFunction(const double & a, double & b, const double c, const double * d); 

我可以合法地调用someFunction使用:

someFunction(*ptr1, *ptr2); 

和/或

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

其中变量ptr1ptr2val,和val2已经适当定义和val1val2不等于零?为什么或者为什么不?

如果它是合法的,这个语法首选与重载函数来说明可选参数?

回答

5

是的,这是合法的,这叫做default arguments。我会说,由于涉及较少的代码,所以最好是重载。

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

+0

感谢您的回复并回复链接。我不知道这些被称为什么。为什么默认参数是'const'是合法的?它们看起来像是'const'意味着它们不能被改变。 – Evan 2011-05-13 09:22:47

+1

@Evan:'const'限定符适用于函数参数,而不是所提供的默认值。默认值的分配发生在函数调用时,就像提供的参数的赋值一样。如果事情按照你所想的方式工作,那么用'const'参数多次调用一个函数是非法的。 – Omnifarious 2011-05-13 09:41:26

1

是的,参数是可选的,当你不通过它们时,将使用给定的默认值。

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

我个人更倾向于默认参数。

0

我可以合法地调用someFunction使用:

someFunction(* PTR1,PTR2 *);

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

但是,如果你提供了第3和第4个函数参数,那么这些值被视为而不是默认值。

1

我想扩大一点,是否默认参数优于重载。

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

也有使在某些情况下重载一个更好的选择正当的理由:

默认值是接口的一部分,变化可能会破坏客户(@Juraj已经提到) 此外重载使其更容易添加额外的(组合)参数,而不会破坏(二进制)接口。

重载在编译时解决,这可以使编译器更好地优化(特别是内联)可能性。例如如果你有这样的事情:

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

它可能会更好使用重载。