为什么我不在C++中使用这个结构的构造函数?
我的教授正在给一个班上的学生建立一个没有构造函数的结构列表。但不管出于什么原因,我们说构造函数是不必要的,为什么会这样呢?我给他发了电子邮件,但没有收到任何回复,所以我想知道是否有人能告诉我为什么它不需要构造函数。这是结构和类 结构记录 { 字符串类名称; 煤焦品位; }; 班级学生 { 公众: Studentstring&name; 作废打印记录; char gradeForClassstring&cl_名称; 竖立的绳子; void addClassstring&,char; 私人: 国际货币基金组织; 字符串st_name; std::列出st_记录; }; 如果您谈论的是记录,他/她是正确的,因为您可以初始化记录对象,而无需为其编写构造函数。记录是一种聚合,这意味着您可以使用: 但这种方法存在一些问题。由于一些复杂的规则,这:为什么我不在C++中使用这个结构的构造函数?,c++,C++,我的教授正在给一个班上的学生建立一个没有构造函数的结构列表。但不管出于什么原因,我们说构造函数是不必要的,为什么会这样呢?我给他发了电子邮件,但没有收到任何回复,所以我想知道是否有人能告诉我为什么它不需要构造函数。这是结构和类 结构记录 { 字符串类名称; 煤焦品位; }; 班级学生 { 公众: Studentstring&name; 作废打印记录; char gradeForClassstring&cl_名称; 竖立的绳子; void addClassstring&,char; 私人: 国际货
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当前需要构造函数在创建时设置名称。。或者构造器不一定与其他东西相关?