1

多くの記事や書籍で提案されている多くの C++ プログラミングのベスト プラクティスがあります。以下は、C++ クラス データ メンバーに関連するサブセットです。

  1. オブジェクトを使用する前に、オブジェクトが初期化されていることを確認してください。
  2. すべてのコンストラクターがオブジェクト内のすべてを初期化するようにしてください。
  3. 通常、各コンストラクターの本体よりも初期化子リストでデータ メンバーを初期化する方が効果的です。
  4. 初期化子リストでは、データ メンバーは宣言されている順序でリストする必要があります。

Qt クラス型のデータ メンバーを持つ次のクラスを検討してください。

class MyClass {
public:
    myClass();
    ~myClass();
private:
    int myInt;
    QString myQString;
    QList<QString> myQList;
    QHash<int, QString> myQHash;
    char * pChar;
};

上記のベスト プラクティスを適用すると、コンストラクター コードは次のようになります。

MyClass::MyClass() :
    myInt(0),    // OK, primitive should be initialized.
    myQString(),    // Is this really needed?
    myQList(),     // Is this really needed?
    myQHash(),    // Is this really needed?
    pChar(NULL)    // OK, pointer should be initialized.
{
}

ただし、すべての Qt クラス データ メンバを初期化する必要はないという印象があります。しかし、私はこれを 100% 確信しているわけではありません。一部の開発者は、すべてのデータ メンバーを初期化リストに入れることで、初期化する必要があるいくつかの重要なデータ メンバーの初期化を省略することを避けることができると主張しています。ただし、これが本当に懸念事項である場合は、初期化する必要のないデータ メンバーごとにコメント行を追加することをお勧めします。たとえば、次のようになります。

MyClass::MyClass() :
    myInt(0), 
    //myQString(),
    //myQList(),
    //myQHash(),
    pChar(NULL) 
{
}

要約すると、Qt クラスのデータ メンバーを初期化する必要がある場合と、初期化が不要な場合とその理由を知りたいと思います。ありがとう!

4

2 に答える 2

6

クラスのデフォルト コンストラクターがない場合は、初期化リストで初期化する必要があります。初期化リストでデフォルト コンストラクターを呼び出す必要はありません。これは Qt 固有のものではなく、すべてのクラスの一般的な規則です。初期化子リストで呼び出さなくても、デフォルトのコンストラクター(引数を取りません)がある場合は、自動的に呼び出されます。

アップデート:

Q1: 上記の MyClass::MyClass() の 2 つのバージョンは同等ですか? つまり、同じ内容の 2 つのオブジェクトを生成しますか?

はい。

Q2: あるバージョンは他のバージョンよりも高速ですか?

2 番目のバージョンの方が速く入力できます ;-)、パフォーマンスに違いはありません。

于 2016-03-12T03:55:21.597 に答える