c++中可变构造函数的用途是什么?
What is the use of variadic constructor in C++?
考虑以下程序:
#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中,您没有这些工具。
相关文章:
- 为什么调用复制构造函数而不是移动构造函数?
- 调用值构造函数而不是复制构造函数
- 这是使用构造函数初始化数组对象的最佳方法吗?
- 为什么编译器使用移动构造函数而不是复制构造函数
- 为什么在我的代码中调用复制构造函数而不是移动构造函数?
- 确定是调用构造函数还是强制转换运算符的因素
- C++ 03 类模板 这是转换构造函数还是转换运算符?以及如何声明解决此问题的方法
- 将对象传递给函数并不是导致构造函数调用
- 为什么在返回时将复制构造函数而不是移动构造函数
- 为什么调用转发引用构造函数而不是复制构造函数?
- 双向链表问题(特别是复制构造函数和删除函数)
- 单冒号是什么意思 c++ 函数接口
- 是复制构造函数中初始值设定项列表中的make_unique不使用noexcept说明符的好用途
- 指示汇编时间叫什么构造函数
- When是私有构造函数而不是私有构造函数
- "undefined reference to"不是模板构造函数,而是我尝试使用该模板的类的构造函数
- 正在调用基方法,而不是从构造函数派生方法
- 什么是转换构造函数
- 什么是合成构造函数
- 你能用英语尽可能简单地解释一下什么是复制构造函数,什么时候需要使用它吗?