我遇到过一些看起来像这样的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
已正确定义变量ptr2
,val
,val2
和val1
,且val2
和{{1}}不等于零?为什么或为什么不呢?
如果它是合法的,这种语法是否优先于重载函数以考虑可选参数?
答案 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个参数,则会考虑这些值而不是默认值。