C++ 中默认参数的重新定义
在本文中,您将学习如何处理 C++ 中默认参数错误的重新定义。 C++ 中的默认参数必须在方法或函数的声明或定义中指定,但不能同时指定,因为存在重复。
在函数声明中指定实参以处理 C++ 中默认参数重定义错误
导致默认参数重定义错误的原因是其在头文件中的重定义,每次都会从父文件中调用,导致多次重定义函数或方法。
但是,您可以在非模板函数(或方法)的相同范围内的函数(或方法)的后续声明中添加默认参数。 声明在不同的范围内具有完全不同的默认参数集。
带有默认参数的参数后面的每个参数都应提供默认参数、先前的声明或给定函数声明中的函数参数包。 当您在定义(实现)中设置默认参数时,而不仅仅是在声明中设置默认参数时,会发生默认参数重新定义错误。
代码示例:
#include <iostream>
// to process variables whenever called
void print(int x, int y)
{
std::cout << "x: " << x << '\n'; // x output
std::cout << "y: " << y << '\n'; // y output
}
int main()
{
// function declaration
void print(int x, int y = 3);
print(7, 4); // in this case, `y` is user-defined variable hence default argument will be neglected
print(6); // in this case, `y` has no user-defined value hence, it will use default argument
}
输出:
x: 7
y: 4
x: 6
y: 3
如果您的函数(或方法)中有多个参数,则默认参数必须列在所有非默认参数之后,例如 void my_function (int a, char b);。
在 C++ 中,默认参数不会直接导致布尔参数的 tarpit,但这些参数会使它们的有害影响变得更糟,因此,布尔 tarpit 的处理变得极其复杂。
在函数定义中指定参数以处理 C++ 中默认参数重新定义错误 如果任何函数参数具有默认参数,则函数调用可以从调用者检索任何函数参数的参数,并且如果调用者不提供参数,则使用该特定参数的默认参数的值 。 默认参数一旦声明,就不能因为重复而重新声明,这意味着默认参数可以在函数定义中声明。
默认参数的前向声明是声明默认参数而不是在函数定义中声明它的最佳实践之一。
代码示例:
#include <iostream>
void print(int x, int y=4) // 4 is the default argument
{
std::cout << "x: " << x << '\n';
std::cout << "y: " << y << '\n';
}
int main()
{
print(1, 2); // y will use user-supplied argument 2
print(3); // y will use default argument 4
}
// in case of multiple default arguments
void printmulti(int x=10, int y=20, int z=30)
{
std::cout << "x: " << x << '\n';
std::cout << "y: " << y << '\n';
std::cout << "z: " << z << '\n';
}
输出:
x: 1
y: 2
x: 3
y: 4
默认参数在语法上出现在函数(或方法)声明中,但默认参数本身的行为类似于定义,因为每个翻译单元只能有一个。 不允许在函数定义中重复默认参数的值,这意味着函数接口的一部分在其实现位置是不可见的。
默认参数的定义在一处而求值在另一处导致中间 C++ 方面的混乱,例如名称查找、访问控制和模板实例化。
相关文章
Arduino 复位
发布时间:2024/03/13 浏览次数:315 分类:C++
-
可以通过使用复位按钮,Softwarereset 库和 Adafruit SleepyDog 库来复位 Arduino。
Arduino 的字符转换为整型
发布时间:2024/03/13 浏览次数:181 分类:C++
-
可以使用简单的方法 toInt()函数和 Serial.parseInt()函数将 char 转换为 int。
Arduino 串口打印多个变量
发布时间:2024/03/13 浏览次数:381 分类:C++
-
可以使用 Serial.print()和 Serial.println()函数在串口监视器上显示变量值。