在C++中执行构造函数

jsp*_*p99 2 c++ constructor

构造函数的执行分两个阶段完成:

  1. 初始化阶段

  2. 正文执行阶段,由构造函数体内的所有语句组成.请注意,类型的数据成员始终在初始化阶段初始化,无论该成员是否在构造函数初始化列表中显式初始化.初始化发生在构造函数体的任何语句执行之前.

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

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

这是另一种,但"低效"和"不优雅"的做法 -

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

新代码中的此构造函数(上面的代码)分配类Student的成员.它没有明确初始化它们.是否存在显式初始值设定项,即使在执行构造函数之前,也会初始化first_name和last_name成员.此构造函数隐式使用默认字符串构造函数来初始化first_name和last_name成员.执行构造函数的主体时,first_name和last_name成员已具有值.这些值将被构造函数体内的赋值覆盖.

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

  • 'first_name',这是一个字符串,通过调用默认的字符串构造函数(编译器' make ')来初始化.
  • 'last_name',这是一个字符串,通过调用默认的字符串构造函数(编译器' make ')来初始化.
  • "ID",它是一个整数未初始化.
  • "年",这是一个整数初始化.

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

我对这件事的理解是对的吗?我不知何故觉得我错过了什么.

此外,在使用初始化列表,是默认的构造函数(其中一个编译器我们),被称为与我们的参数传递(在案件)和初始化完成,如"诠释的id = I;"在ID的情况下(一世) ??

PS:大多数报价均来自此链接 -

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

Set*_*gie 7

您的理解大多是正确的,除非您必须在初始化程序中初始化const成员,因为您无法const在构造函数的主体中或其他任何地方分配它们(因为它们).如果您尝试保留const未初始化的成员,则会出现编译错误.

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

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

  • 当班级有const成员时
  • 当类是没有默认构造函数的类的直接子类时
  • 当班级有参考成员时