2011年12月22日木曜日

初期化リスト

オブジェクトの初期化方法いろいろ

配列を初期化する場合、次のような初期化リストを使用します。

int[] array = {1, 2, 3, 4, 5};

クラスや構造体を初期化する場合もこの書式を使うことができます。

ClassA a = {1, 2, 3, 4, 5};
StructB b = {1, 2, 3, 4, 5};

このように初期化する場合は、対象のクラスや構造体がPODであるか、次のようにコンストラクタを定義する必要があります。

class ClassA {
public:
  ClassA(std::initializer_list<int> list);
};
struct StructB {
  int a, b, c, d, e;
};

このように、std::initialize_list<T>をコンストラクタの引数に指定することで、初期化リストを使用してオブジェクトを初期化することができます。

関数の引数に初期化リストを使用する

std::initializer_list<T>を関数の引数に指定することができます

int sum(std::initializer_list<int> list) {
  int result = 0;
  for (auto i = list.begin(); i != list.end(); ++i) {
    result += *i;
  }
  return result;
}
int main() {
  int result = sum({1, 2, 3, 4, 5});
}

どんなときに使うか

任意の数の引数を受け取る方法として、可変長引数テンプレートやCの可変長引数があります。それらと比べて引数リストを使用する利点として、「型が指定できる」「配列と同じ書式で初期化できる」と言った店が挙げられます。

とくに、「配列と同じ書式で初期化できる」というのは、可読性が良くなるので積極的に利用したいところです。が、見当違いな使い方をすると、逆に解りづらくなるので使い方には注意が必要です。

0 件のコメント:

コメントを投稿