Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;默认括号内的初始值设定项列表_C++_C++11_Constructor_Initialization - Fatal编程技术网

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可以解决这一问题,但仅针对不同的构造函数顺序就需要大量工作。