c++中可变构造函数的用途是什么?

What is the use of variadic constructor in C++?

本文关键字:是什么 构造函数 c++      更新时间:2023-10-16

考虑以下程序:

#include <iostream>
struct Test
{
    Test(...)
    {
        std::cout<<"Variadic constructorn";
    }
};
int main()
{
    Test t;
    t={3,4,5};
}

我认为它是可变的构造函数。c++标准规定构造函数可以是可变的吗?这种构造函数的用途是什么?允许可变构造函数的基本原理是什么?

让我们试着逐一回答你的问题:

我认为它是可变的构造函数。

你是正确的

c++标准规定构造函数可以是可变的吗?

我想是的。为什么不呢?构造函数只是一个(成员)函数。

这样的构造函数有什么用?

像其他可变函数一样——传递可变数量的参数。它也有同样的问题,主要是没有类型安全性和任何其他可变函数一样。例如,假设你需要一个(C)字符串列表,你可以这样做。

#include <iostream>
#include <cstdarg>
struct Test
{
    Test(int n,...)
    {
        va_list va;
        va_start(va, n);
        for (int i = 0; i < n; ++i) {
             char const *s = va_arg(va, char*);
             std::cout<<"s=" << s << std::endl;
        }
        va_end(va);
    }
};
int main()
{
     Test t{3, "3","4","5"};
}

请记住,要使其工作,您至少需要一个"非可变"参数。因此,像您所展示的这样的"纯可变"构造函数在可移植的c++代码中没有多大意义。对于任何特定的平台,您可能知道如何访问参数,即使没有非可变参数,所以,这可能是可行的:

     Test t={"3","4","5", NULL};

允许可变构造函数的基本原理是什么?

"它是C兼容的,有人可能会用它",我猜。如果您了解<cstdarg>的方法,它可能是一个有效的工具。当然,在c++ 11中,你应该使用可变模板/完美的转发和初始化列表。但是,在c++ 98中,您没有这些工具。