关于构造函数的问题

Questions about the constructors

本文关键字:问题 构造函数      更新时间:2023-10-16

所以,我刚刚读到关于构造函数初始化器的内容以及它们为什么重要。

所以,在这方面,我之所以这么问,只是因为它没有被明确提及,我不想学到错误的东西。

因此,在非初始化构造函数的情况下,例如:

Student(int i, string s) {
    id = i;
    name = s;
}

调用构造函数时(创建实例时自动调用),在输入构造函数的主体之前,成员id和name是否首先分别初始化为int和string的默认值(这些默认值是什么?),当输入主体时,它们分别用i和s覆盖。我的解释正确吗?

如果是这样的话,那么初始化器构造函数如下所示:

Student(int i, string s) : id(i), name(s) {}

统治至高无上,应该一直使用,对吧?

在这种情况下,为什么要教另一个构造函数呢?

基本数据类型未初始化。对象是使用其默认构造函数创建的。

在您的示例中,它们确实被新值覆盖了。根据类型的不同,这可能是低效的,因为在默认构造函数中完成的工作可能会被浪费。在基本类型的情况下,编译器可以优化初始化,在std::string(应该通过const引用btw传递)的情况下与复制字符串的成本相比,它有一个相对便宜的默认构造函数。因此,尽管初始化列表应该是preferred样式,但在这种情况下不使用它并不是很糟糕。

之所以有构造函数,是因为您可能有比简单地复制一些数据或将其分配给简单值更复杂的逻辑。尝试创建自己的字符串类,该类使用const char *参数。

是的,你是对的。编译器将为它们提供默认值。数值类型为零,字符串为空,矢量为空,布尔值为false等等。这就是为什么在初始化列表之外进行初始化会带来性能损失:编译器首先初始化,然后分配值。此外,使用{}初始化还会检查数据类型是否正确。如果执行myInteger{2.5},则会出现错误,但如果执行myInteger=2.5,则只在变量中放入2。关于对象,编译器将使用它们的默认构造函数。
sample::sample(int a)
{
    cout<< anim;
    anim = a;
    cout<< anim;
}

调用时

sample *Anim = new sample(10);

输出为:

0(grabage值由编译器分配。你不应该从未初始化的变量中读取,没有规则它总是给出0,它只会打印一些垃圾值)

10

sample::sample(int a) : anim(a)
{
    cout<< anim;
    anim = a;
    cout<< anim;
}

输出为:

10(我们正在分配的值)

10

在前一种情况下,值初始化发生在anim=a,即数据成员int anim是用一些垃圾值创建的,并初始化为a,在后一种情况中,初始化发生在创建数据成员时。