Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.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++ - Fatal编程技术网

为什么我不在C++中使用这个结构的构造函数?

为什么我不在C++中使用这个结构的构造函数?,c++,C++,我的教授正在给一个班上的学生建立一个没有构造函数的结构列表。但不管出于什么原因,我们说构造函数是不必要的,为什么会这样呢?我给他发了电子邮件,但没有收到任何回复,所以我想知道是否有人能告诉我为什么它不需要构造函数。这是结构和类 结构记录 { 字符串类名称; 煤焦品位; }; 班级学生 { 公众: Studentstring&name; 作废打印记录; char gradeForClassstring&cl_名称; 竖立的绳子; void addClassstring&,char; 私人: 国际货

我的教授正在给一个班上的学生建立一个没有构造函数的结构列表。但不管出于什么原因,我们说构造函数是不必要的,为什么会这样呢?我给他发了电子邮件,但没有收到任何回复,所以我想知道是否有人能告诉我为什么它不需要构造函数。这是结构和类

结构记录 { 字符串类名称; 煤焦品位; }; 班级学生 { 公众: Studentstring&name; 作废打印记录; char gradeForClassstring&cl_名称; 竖立的绳子; void addClassstring&,char; 私人: 国际货币基金组织; 字符串st_name; std::列出st_记录; }; 如果您谈论的是记录,他/她是正确的,因为您可以初始化记录对象,而无需为其编写构造函数。记录是一种聚合,这意味着您可以使用:

但这种方法存在一些问题。由于一些复杂的规则,这:

Record r;
将使r.grade字段处于未初始化状态。您需要改为使用此选项:

Record r{};
另一个选项是对grade进行默认初始化

如果您谈论的是记录,他/她是正确的,因为您可以初始化记录对象,而无需为其编写构造函数。记录是一种聚合,这意味着您可以使用:

但这种方法存在一些问题。由于一些复杂的规则,这:

Record r;
将使r.grade字段处于未初始化状态。您需要改为使用此选项:

Record r{};
另一个选项是对grade进行默认初始化


构造函数的目的是将对象的状态设置为定义良好的初始状态,以便在构造函数返回后可以使用

要使struct记录处于定义良好的初始状态,需要初始化class_name和grade字段

类名称的类型为std::string,因此std::string类的构造函数将负责初始化它

grade,OTOH,是一种没有构造函数的基本类型,因此除非在别处显式初始化,否则在创建记录对象后,它将包含未初始化的内存


因此,我认为你的教授在技术上是对的,但从设计的角度来看,他是错的;记录结构的构造函数将有助于保证正确性。在没有构造函数的情况下,您必须依靠调用代码记住初始化等级值,如果调用代码忘记初始化,则可能会出现未初始化的内存读取错误。

构造函数的目的是将对象的状态设置为定义良好的初始状态,这样在构造函数返回后就可以使用了

要使struct记录处于定义良好的初始状态,需要初始化class_name和grade字段

类名称的类型为std::string,因此std::string类的构造函数将负责初始化它

grade,OTOH,是一种没有构造函数的基本类型,因此除非在别处显式初始化,否则在创建记录对象后,它将包含未初始化的内存

因此,我认为你的教授在技术上是对的,但从设计的角度来看,他是错的;记录结构的构造函数将有助于保证正确性。如果没有构造函数,则必须依靠调用代码来记住初始化等级值,如果/当调用代码忘记这样做时,可能会引入未初始化内存读取错误。

假设addClass是将记录实例添加到Student::st_记录列表中的唯一方法,则从技术上讲,记录不需要自己的构造函数,因为addClass可以默认构造一个新记录,并在将其添加到列表之前用值完全填充它,例如:

void Student::addClass(string &name, char grade)
{
    Record r;
    r.class_name = name;
    r.grade = grade;
    st_records.push_back(r);
}
假设addClass是将记录实例添加到Student::st_记录列表中的唯一方法,那么从技术上讲,记录不需要自己的构造函数,因为addClass可以默认构造一个新记录,并在将其添加到列表之前用值完全填充它,例如:

void Student::addClass(string &name, char grade)
{
    Record r;
    r.class_name = name;
    r.grade = grade;
    st_records.push_back(r);
}

请正确缩进并格式化代码。它是不可读的。默认情况下,结构中的字段是公共的,因此记录类型可以有意义地使用,而无需自定义构造函数使用初始化或稍后对字段的赋值。Student当前需要构造函数在创建时设置名称。。或者构造器不需要与其他内容相关?请正确缩进并格式化代码。它是不可读的。默认情况下,结构中的字段是公共的,因此记录类型可以有意义地使用,而无需自定义构造函数使用初始化或稍后对字段的赋值。Student当前需要构造函数在创建时设置名称。。或者构造器不一定与其他东西相关?