3

有两种方式构造一个类:

  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;
  }
4

3 回答 3

10

表现:

第一个是最好的,因为它在真正意义上初始化对象,这与分配已经初始化 的对象的第二种方法不同。

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

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

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

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

必要性:

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

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

这些成员不能被分配,但它们必须在成员初始化器列表中初始化。


鉴于上述作为一种做法,第一种方法总是可取的。

于 2012-12-10T03:59:55.740 回答
6

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

于 2012-12-10T04:00:48.520 回答
0

一般来说,初始化列表更好。检查此 C++ 常见问题解答。

我的构造函数应该使用“初始化列表”还是“赋值”?

除非您需要以下功能

一个类的一个构造函数可以调用同一个类的另一个构造函数来初始化这个对象吗?

于 2012-12-10T04:05:03.917 回答