构造函数哪种方式最好?

use*_*905 3 c++ constructor

构造类有两种方法:

  class Cell{
  public:
        Cell(int cellID, int nx);
        ~Cell();
  private:
        int cellID_;
        int nx;
  };
Run Code Online (Sandbox Code Playgroud)

第一种方式:

  Cell::Cell(int cellID, int nx)
    : cellID_(cellID), nx_(nx){}
Run Code Online (Sandbox Code Playgroud)

第二种方式:

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

  void Cell::init(int cellID, int nx){
         cellID_ = cellID;
         nx_ = nx;
  }
Run Code Online (Sandbox Code Playgroud)

Alo*_*ave 10

性能:

第一个是最好的,因为它在真正意义上初始化对象,而不像第二个方法分配已经初始化的对象.

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

如您所见,在后者中存在创建和分配的额外开销,这对于用户定义的类可能是相当大的.

Cost of Member Initialization = Object Construction 
Cost of Member Assignment = Object Construction + Assignment
Run Code Online (Sandbox Code Playgroud)

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

必要性:

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

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

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


鉴于以上作为实践,第一种方法总是优选的.


Jer*_*fin 6

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