构造函数哪种方式最好?

时间:2012-12-10 03:58:25

标签: c++ constructor

构建一个类有两种方法:

  class Cell{
  public:
        Cell(int cellID, int nx);
        ~Cell();
  private:
        int cellID_;
        int nx;
  };

第一种方式:

  Cell::Cell(int cellID, int nx)
    : cellID_(cellID), nx_(nx){}

第二种方式:

  Cell::Cell(int cellID, int nx){init(cellID, nx)}

  void Cell::init(int cellID, int nx){
         cellID_ = cellID;
         nx_ = nx;
  }

3 个答案:

答案 0 :(得分:10)

性能:

第一个是最好的,因为初始化真正意义上的对象不像第二种方法指定已经初始化的对象。

请注意,使用第二种方法时会产生一些开销:

正如您所看到的,还有额外的创作和开销。后者中的赋值,对于用户定义的类可能是相当大的。

Cost of Member Initialization = Object Construction 
Cost of Member Assignment = Object Construction + Assignment

如果成员是内置/ POD数据类型,则没有开销,但如果成员是非POD类型,则开销很大。

必要性:

请注意,在某些情况下,您将被迫使用成员初始值设定项列表:

  • 您的班级有参考会员
  • 您的类具有非静态const成员

此类成员无法分配,但必须在成员初始化列表中初始化。


鉴于上述情况,第一种方法总是优先考虑。

答案 1 :(得分:6)

第一种几乎总是首选。对于任何引用成员const或仅需要初始值设定项(即不能默认构造),必要。在其他情况下,它可以通过直接初始化成员对象而不是默认构造来减少额外的工作,然后再分配给它。

答案 2 :(得分:0)