美文网首页
C++<第七篇>:可变参数

C++<第七篇>:可变参数

作者: NoBugException | 来源:发表于2022-01-11 20:51 被阅读0次

一、可变参数的简单写法

见如下代码:

void function(int a, ...) {

}

这是一个最简单的可变参数的方法。

在传递实参时,可以在 function 中添加多个整数类型。

如下:

function(3);
function(3, 4);
function(3, 4, 5);
function(3, 4, 5, 6);
function(3, 4, 5, 6, 7);
function(3, 4, 5, 6, 7, 8);

这里传递多少实参都是可以的。

二、如何操作可变参数的值

[方法一] 使用stdarg.h中的三个宏

#include <iostream>
#include <stdarg.h>
using namespace std;


void function(int count, ...) {

    va_list parameters; // 声明一个va_list变量
    va_start(parameters, count); // 初始化,count为形参的个数,所以需要提前知道形参的个数

    for (int i = 0; i < count; i++) {
        int parameter = va_arg(parameters, int);  // 取值
        cout << "parameter:" << parameter << endl;
    }

    va_end(parameters); // 清理内容
}

int main()
{
    function(9, 9, 8, 7, 6, 5, 4, 3, 2, 1);

    return 0;
}

打印结果是:

parameter:9
parameter:8
parameter:7
parameter:6
parameter:5
parameter:4
parameter:3
parameter:2
parameter:1

使用步骤是:

(1)导入stdarg.h

#include <stdarg.h>

(2)定义一个含有可变参数的方法

void function(int count, ...) {

}

count为后面参数的个数,不包括自己。也就是说,function方法的形参个数是:count + 1

(3)声明一个va_list变量

va_list parameters; // 声明一个va_list变量

(4)初始化

va_start(parameters, count); // 初始化,count为形参的个数,所以需要提前知道形参的个数

(5)取值

int parameter = va_arg(parameters, int);  // 取值

取值时,必须指明取值类型。

(6)清理内容

va_end(parameters); // 清理内容

(7)实参的传递

function(count, 5, 4, 3, 2, 1);

代码中,function的第一个实参是va_list的长度,count的不同取值决定了输出结果:

count = 0   ------------   没有输出结果
count = 1   ------------   输出结果:5
count = 2   ------------   输出结果:5,4
count = 3   ------------   输出结果:5,4,3
count = 4   ------------   输出结果:5,4,3,2
count = 5   ------------   输出结果:5,4,3,2,1

在使用va_start初始化时,第二个参数是parameters的长度,function参数的数量不是固定的,是变化的。
parameters的长度必须和可变参数的数量一致,如果不一致,容易导致数据的紊乱;

比如:

function(6, 5, 4, 3, 2, 1);

function除了第一个参数之外,其它参数都是可变参数,当执行初始化方法va_start时,可变参数将存入parameters中,与此同时一起被初始化的还有可变参数的数量。
当初始化传入的数量与实际可变参数数量不一致时,输出的实际结果可能和预想的不一致。

当传入的数量大于实际可变参数数量时,输出结果将会异常。

function(6, 5, 4, 3, 2, 1)的输出结果为:

parameter:5
parameter:4
parameter:3
parameter:2
parameter:1
parameter:-858993460

parameters的长度为6,但是只有5个值。

另外,可变参数可能不都是一个数据类型,它们有可能存在多种数据类型,比如:

#include <iostream>
#include <stdarg.h>
using namespace std;

/*
charCount:字符串类型参数的数量
intCount:整型参数的数量
*/
void function(int count, ...) {

    va_list parameters; // 声明一个va_list变量

    va_start(parameters, count); // 初始化,count为形参的个数,所以需要提前知道形参的个数
    for (int i = 0; i < count; i++) {
        char* charParameter = va_arg(parameters, char*);  // 字符串取值
        int intParameter = va_arg(parameters, int);  // 整型取值
        cout << "字符串:" << charParameter << endl;
        cout << "整型:" << intParameter << endl;
    }
    va_end(parameters); // 清理内容

}

int main()
{
    function(3, "张三", 4, "李四", 2, "王五", 1);

    return 0;
}

输出结果是:

字符串:张三
整型:4
字符串:李四
整型:2
字符串:王五
整型:1

[方法二] 使用initializer_list标准库类型

演示代码如下:

#include <iostream>
#include <initializer_list>

using namespace std;


void function(initializer_list<int> list) {

    for (auto ptr = list.begin(); ptr != list.end(); ptr++) {
        cout << "输出数字:" << *ptr << endl;
    }
}

int main()
{
    function({3, 4, 5, 1});

    return 0;
}

输出结果为:

输出数字:3
输出数字:4
输出数字:5
输出数字:1

该方法不需要指定list的长度,所以比方法一更加安全。在实际开发中,应该选择方案二。

使用initializer_list需要注意的是:

(1)元素必须具有相同的数据类型;
(2) initializer_list在C++11才被引入;
(3)传递实参时,参数需要放在{}(大括号)内;

[本章完...]

相关文章

  • C++<第七篇>:可变参数

    一、可变参数的简单写法 见如下代码: 这是一个最简单的可变参数的方法。 在传递实参时,可以在 function 中...

  • C++ 泛型编程(一) —— 可变参数模板

    可变参数模板函数 可变参数模板是 C++ 11 中引入的一个新特性,它允许我们定义一个可以接受可变数目参数的模板函...

  • day14

    可变和不可变参数 不可变类型: 类似 c++ 的值传递,如 整数、字符串、元组。如fun(a),传递的只是a...

  • *args和**kwargs的用法

    可变位置参数*args *args为一个列表,用于向函数传递数量可变的参数,我觉得相当于Java和C++中的重载,...

  • c++函数可变参数

  • C/C++可变参数

    C/C++中支持传递可变参数,即不定参数,例如: 那么如何拿到不定参数,需要借助va_list类型,包含在cstd...

  • C++可变参数宏

    格式 C99开始支持如下可变参数宏 GCC同样支持如下格式 连接符,在展开如将每一个arg展开了arg加上逗号,如...

  • 元组、字典可变参数

    可变参数 需求: 参数数量不确定,能否接收? args元组可变参数 kwargs字典可变参数 传递可变参数

  • C/C++可变参数机制

    在写一个函数时,经常会有实现一个参数未知或不是常数的函数的需求。printf就是这样的一个函数,在 Section...

  • C++可变参数模板

    可变参数模板 原文链接: http://blog.csdn.net/xiaohu2022/article/deta...

网友评论

      本文标题:C++<第七篇>:可变参数

      本文链接:https://www.haomeiwen.com/subject/ndjvcrtx.html