试图挑战我在C ++中的知识,我创建了一个简单的示例,该示例显示列表初始化提供与使用构造函数对象相同的代码:
struct ee{
unsigned m, h , k;
};
class R{
unsigned a,b,c;
ee kl;
public:
R(unsigned p, unsigned q, unsigned r, ee s){ // s is not a reference
a = p;
b = q;
c = r;
kl = s;
}
};
class S{
unsigned a,b,c;
ee kl;
public:
S(unsigned p, unsigned q, unsigned r, ee s): a(p),b(q),c(r), kl(s){}
};
S square(unsigned num, unsigned yum, unsigned po, ee &no) {
if (num > 5){
S a(num + 8, yum - 2, po,no);
return a;
}
else{
S a(num + 18, yum + 3, po + 1, no);
return a;
}
}
R square2(unsigned num, unsigned yum, unsigned po, ee &no) {
if (num > 5){
R a(num + 9, yum + 90, po, no);
return a;
}
else{
R a(num + 34, yum + 12, po + 1, no);
return a;
}
}
您可以在这里自己尝试:godbolt
在性能方面,是否仍然客观地还是有价值的?或者现在可以说,使用最新的编译器,任何符号都输出相同的代码吗?
好吧,这个问题不是很受欢迎,很好。在我使用的上下文中,这两种初始化方法总是会产生相同的结果,因为我们不能使用const
,也不能在类内使用单个引用,也不能使用new / delete或其他任何东西。我们通过引用方法来传递对象。那是我们的指导方针。而且有效。无论如何,谢谢;)
答案 0 :(得分:0)
使用初始化列表和在构造函数中分配是不同的。成员以任何方式初始化。如果您不这样做,那么它们将被默认初始化。通常,仅初始化要比初始化然后赋值便宜。也许在您的情况下,编译器发出了相似甚至相同的代码,但是在构造函数中分配时,您可能无法做一些事:
const
成员只能初始化,不能分配给