3

クラスを作成する方法は2つあります。

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

最初の方法:

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

2番目の方法:

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

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

3 に答える 3

10

パフォーマンス:

最初の方法は、すでに初期化され たオブジェクトを割り当てる2番目の方法とは異なり、真の意味でオブジェクトを初期化するため、最適です。

2番目の方法を使用する場合、少しオーバーヘッドがあることに注意してください。

ご覧のとおり、後者には作成と割り当ての追加のオーバーヘッドがあります。これは、ユーザー定義のクラスではかなりの量になる可能性があります。

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++FAQを確認してください。

コンストラクターは「初期化リスト」または「割り当て」を使用する必要がありますか?

以下の機能が必要な場合を除きます

クラスのあるコンストラクターが同じクラスの別のコンストラクターを呼び出して、このオブジェクトを初期化できますか?

于 2012-12-10T04:05:03.917 に答える