C ++类:构造函数的列表初始化变得没有用吗?

时间:2019-06-16 15:13:58

标签: c++ class constructor

试图挑战我在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或其他任何东西。我们通过引用方法来传递对象。那是我们的指导方针。而且有效。无论如何,谢谢;)

1 个答案:

答案 0 :(得分:0)

使用初始化列表和在构造函数中分配是不同的。成员以任何方式初始化。如果您不这样做,那么它们将被默认初始化。通常,仅初始化要比初始化然后赋值便宜。也许在您的情况下,编译器发出了相似甚至相同的代码,但是在构造函数中分配时,您可能无法做一些事:

  • const成员只能初始化,不能分配给
  • 引用成员必须初始化
  • 没有默认构造函数的成员不能被默认默认初始化,但是您需要对其进行初始化
  • 也许我想念的更多