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++ 方面的混乱,例如名称查找、访问控制和模板实例化。
相关文章
C++ 形式参数的重新定义
发布时间:2023/08/24 浏览次数:132 分类:C++
-
在本文中,我们将讨论 C++ 中形式参数的重新定义问题。首先,我们将讨论函数定义和形式参数。 接下来,我们将讨论形式参数的重新定义问题。
用 C++ 读取 PPM 文件
发布时间:2023/08/24 浏览次数:108 分类:C++
-
在本文中,我们将了解 PPM 文件并使用 C++ 读取它们。我们将首先讨论并了解 PPM 文件格式。 稍后,我们将学习用 C++ 读取 PPM 文件的分步过程。
检查 Linux 中的 C++ 编译器版本
发布时间:2023/08/24 浏览次数:60 分类:C++
-
本文是关于检查 Linux 操作系统上安装的 C++ 编译器的版本。 此外,在撰写本文时,我们还将探讨 C++ 最新版本 C++ 11 的激活过程。检查 Linux 中的 C++ 编译器版本
C++ 中结构体和类的区别
发布时间:2023/08/23 浏览次数:52 分类:C++
-
本文解释了 C++ 中结构体和类之间的区别。 本文是针对最新版本的 C++ 编写的; 旧版本中的结构和类之间存在更多限制和差异。在大多数情况下,结构与类非常相似,但差异很少。 让我们一一
C++ 中的类模板继承
发布时间:2023/08/23 浏览次数:142 分类:C++
-
本文将讨论 C++ 中最流行和最常用的方法之一(即类模板)。C++ 中模板的添加带来了一种新的编码范式,称为通用编程。 现在,这是 C++ 程序员工具包的一个重要元素,是许多标准库的基础,也
C++ 中的Point 和 Line 类
发布时间:2023/08/23 浏览次数:158 分类:C++
-
C++ 中的 Point 和 Line 类是可以表示点和线的主要数据类型。 它提供了操作点、条形和向量的方法。C++ 中 Point 和 Line 类的基本用例 Point 和 Line 类是 C++ 语言的基本部分。