C++ C++;默认括号内的初始值设定项列表
假设我有一个C++ C++;默认括号内的初始值设定项列表,c++,c++11,constructor,initialization,C++,C++11,Constructor,Initialization,假设我有一个c_学生班,有几个成员,没有构造器: #包括 #包括 #包括 #包括 c班学生{ //私人: 公众: std::string name=“John”; 整数分=5; std::string second_name=“Doe”; 作废打印(){ std::cout很遗憾,这是不可能的。您的代码最初工作的原因在于。一旦创建了用户定义的构造函数,您的类就不再是聚合类型 聚合是以下类型之一: 具有的类类型 --没有用户声明的构造函数 通过将所有构造函数替换为以下构造函数,可以使用大括号初
c_学生
班,有几个成员,没有构造器:
#包括
#包括
#包括
#包括
c班学生{
//私人:
公众:
std::string name=“John”;
整数分=5;
std::string second_name=“Doe”;
作废打印(){
std::cout很遗憾,这是不可能的。您的代码最初工作的原因在于。一旦创建了用户定义的构造函数,您的类就不再是聚合类型
聚合是以下类型之一:
- 具有
的类类型
--没有用户声明的构造函数
通过将所有构造函数替换为以下构造函数,可以使用大括号初始化实现所需的功能:
c_student (std::string name = "John", int mark = 5, std::string second_name = "Doe")
: name(name), mark(mark), second_name(second_name) {};
此外,您还可以删除默认的成员初始值设定项,因为构建c_学生
的唯一方法是在未提供默认值的情况下为其提供默认值
这里有一个。您可以添加另一个用户定义的构造函数来处理带有两个条目的初始值设定项列表(并为每个可能的列表大小和顺序不断添加此类构造函数)。以下编译和工作与预期的一样:
#包括
#包括
c班学生{
私人:
std::string name=“John”;
整数分=5;
std::string second_name=“Doe”;
公众:
作废打印(){
std::你能确定吗?也许只有在以后的标准中才有可能,但这里有一些相关信息:@SvenNilsson代码工作的原因是他们为B
提供了一个用户定义的构造函数,OP在这里也可以自由地做。但是这里的OP想要“带回”default
聚合初始化行为,正如标准所提到的,这是不可能的。他们必须定义一个用户定义的构造函数来模拟这种行为,这破坏了default
编译器生成的行为。好的,我明白了。你是对的,但有一个解决方法…很好,很有效。如何如果列表元素的顺序不同,比如{“First”,“Last”,20}
?@AdrianMole如果没有C++20指定的初始值设定项,就无法改变参数的顺序。您可以提供显式的(和单独的)具有不同参数顺序的构造函数。@AdrianMole有时,但我认为所有参数都需要不同的类型。例如,如何在c_学生(“Adrian”)
之间消除歧义?这是第一个还是第二个名称?嗯,实际上UDL可以解决这一问题,但仅针对不同的构造函数顺序就需要大量工作。