gpt4 book ai didi

c++ - 在 C++ 中执行构造函数

转载 作者:太空狗 更新时间:2023-10-29 23:47:03 25 4
gpt4 key购买 nike

Execution of constructor is done in two phases:

  1. The initialization phase

  2. Body execution phase which consists of all the statements within the body of constructor. Note that data members of class type are always initialized in the initialization phase, regardless of whether the member is initialized explicitly in the constructor initializer list. Initialization happens before any the statement execution of the constructor body.

让我们考虑一种通过构造函数初始化 class student 实例的方法 -

Student(string &fn, string &ln, int i, int y = Freshman)
: first_name(fn)
, last_name(ln)
, id(i)
, year(y)
{}

这是另一种“低效”且“不够优雅”的方法 -

Student(string &fn, string &ln, int i, int y = Freshman)  
{
first_name = fn;
last_name = ln;
id = i;
year = y;
}

This constructor in the new code (above code) assigns the members of class Student. It does not explicitly initialize them. Whether there is an explicit initializer or not, the first_name and last_name members are initialized even before the constructor is executed. This constructor implicitly uses the default string constructor to initialize the first_name and last_name members. When the body of the constructor is executed, the first_name and last_name members already have values. Those values are overwritten by the assignment inside the constructor body.

所以,这意味着当执行到达构造函数的左括号时,这就是条件 -

  • 'first_name' 是一个字符串,它通过调用默认字符串构造函数(编译器“制作”的构造函数)进行初始化。
  • 'last_name' 是一个字符串,它通过调用默认字符串构造函数(编译器“制作”的构造函数)进行初始化。
  • “id”是一个整数 未初始化
  • 'year',它是一个整数 未初始化

现在,很明显,赋值已在构造函数的主体中对四个变量中的每一个进行了赋值。

我对这件事的理解正确吗?不知何故,我觉得我错过了什么。

此外,在使用初始化列表时,还有默认构造函数(编译器为我们制作),使用我们的参数调用和传递(在 string 的情况下)并按照 "int id = i ; " 在 id(i) 的情况下完成初始化 ??

PS : 大多数引用来自这个链接-

http://www.bogotobogo.com/cplusplus/constructor.php

最佳答案

你的理解大部分是正确的,除了你必须在初始化器中初始化const成员因为你不能分配给他们(因为他们是const ) 在构造函数的主体或其他任何地方。如果您尝试让 const 成员未初始化,则会出现编译错误。

是的,在初始化列表中,会调用与您提供的参数相匹配的对象的构造函数。如果没有参数(例如 : blah()),则调用默认构造函数。

此外,在某些情况下您绝对必须使用初始化列表(它不是可选的),例如

  • 当类有const 成员时
  • 当类是没有默认构造函数的类的直接子类时
  • 当类(class)有引用成员时

关于c++ - 在 C++ 中执行构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7371681/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com