所以,我只是阅读有关构造函数初始值设定项及其重要性的原因。
所以,在这方面,我问这个问题只是因为它没有被明确提及,我不想错误地学习。
因此,在非初始化构造函数的情况下,例如:
Student(int i, string s) {
id = i;
name = s;
}
当调用构造函数时(在创建实例时自动),在进入主体之前,首先将成员id和name分别初始化为int和string的默认值(以及这些默认值是什么?)构造函数和进入正文时,它们分别被i和s覆盖。我的解释是否正确?
如果是这种情况,则初始化构造函数如下:
Student(int i, string s) : id(i), name(s) {}
统治至高无上,应该一直使用,对吗?
在这种情况下,为什么要教其他构造函数呢?
答案 0 :(得分:2)
基本数据类型未初始化。使用默认构造函数创建对象。
在您的示例中,它们确实被新值覆盖。根据类型,这可能是低效的,因为在其默认构造函数中完成的工作可能被浪费。在基本类型的情况下,编译器可以优化初始化,并且在std::string
(你应该通过const引用btw传递)的情况下,与复制字符串的成本相比,它具有相对便宜的默认构造函数。因此,虽然初始化列表应该是首选的样式,但在这种情况下不使用它并不是非常糟糕。
你有一个构造函数的原因是你可能有比复制一些数据或将它们分配给简单值更复杂的逻辑。尝试创建一个带有const char *
参数的字符串类。
答案 1 :(得分:0)
是的,你是对的。编译器将为它们提供默认值。数字类型为零,字符串为空,向量为空,布尔为false等。这就是为什么在初始化列表之外进行初始化会带来性能损失的原因:编译器首先初始化,然后分配值。此外,使用{}初始化还会检查正确的数据类型。如果你这样做myInteger {2.5}你会得到一个错误,但如果你这样做myInteger = 2.5你只在变量中加2。关于对象,编译器将使用它们的默认构造函数。
答案 2 :(得分:0)
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的前一种情况下,值初始化发生,即datamember int anim
创建了一些垃圾值并初始化为a
,在后一种情况下,在创建datamember时会发生初始化。