C++中可变参数与非可变参数
时间: 2023-06-22 12:27:11 浏览: 113
在 C++ 中,可变参数和非可变参数的概念也存在。
非可变参数就是指函数在定义时,参数的数量和类型已经确定,调用时需要传入和定义时一样数量和类型的参数。例如:
```cpp
int add(int x, int y) {
return x + y;
}
int result = add(2, 3);
std::cout << result << std::endl; // 输出 5
```
可变参数在 C++ 中通常使用可变参数模板实现,即模板参数数量不确定,参数类型也不确定,需要在函数调用时确定具体类型和数量。C++11 引入了 `std::initializer_list`,可以方便地实现可变参数模板。
例如,下面是一个求和函数的可变参数实现:
```cpp
#include <iostream>
#include <initializer_list>
template <typename T>
T sum(std::initializer_list<T> args) {
T result = 0;
for (auto i : args) {
result += i;
}
return result;
}
int main() {
auto result1 = sum({2, 3});
auto result2 = sum({2, 3, 4, 5});
std::cout << result1 << std::endl; // 输出 5
std::cout << result2 << std::endl; // 输出 14
return 0;
}
```
需要注意的是,可变参数模板必须放在函数参数列表的最后,否则编译器无法正确推断类型。同时,可变参数模板也可以和非可变参数一起使用。例如:
```cpp
template <typename T>
T add(T x, T y) {
return x + y;
}
template <typename T, typename... Args>
T sum(T first, Args... args) {
return add(first, sum(args...));
}
int main() {
auto result1 = sum(2, 3);
auto result2 = sum(2, 3, 4, 5);
std::cout << result1 << std::endl; // 输出 5
std::cout << result2 << std::endl; // 输出 14
return 0;
}
```
在这个例子中,`sum` 函数的第一个参数是非可变参数,后面的参数是可变参数。函数的实现中,可变参数使用了递归调用,将第一个参数和后面的参数分别相加,最终得到总和。
阅读全文