クラスの基本/初期化 (C++をもう一度)
[履歴] [最終更新] (2014/12/18 23:51:01)
最近の投稿
注目の記事

構造体のように初期化する (非推奨)

#include <iostream>
using namespace std;

const int MAX_STR = 16;

class MyClass {
public:
    int m_integer;
    char m_str[MAX_STR + 1];
    void Show();
};

void MyClass::Show() {
    cout << "val1: " << m_integer << ", "   // ← "" を並べると文字列結合されます (復習)
            "val2: " << m_str     << endl;
}

int main() {
    MyClass obj[] = {
        { 1, "test1" },
        { 2, "test2" },
    };

    int size = sizeof obj / sizeof *obj;

    for (int i = 0; i < size; ++i) {
        obj[i].Show();
    }
    return 0;
}

コンストラクタで初期化する

#include <iostream>
using namespace std;

class MyClass {
    int m_integer;
public:
    void Show();
    MyClass();
    MyClass(int intval);
};

MyClass::MyClass() {
    m_integer = 0;
}

MyClass::MyClass(int intval) {
    m_integer = intval;
}

void MyClass::Show() {
    cout << m_integer << endl;
}

int main() {
    MyClass obj, obj2(1);

    obj.Show();
    obj2.Show();


    // 配列を用意する場合
    MyClass obj_list[] = {
        MyClass(),
        MyClass(1),
    };

    int size = sizeof obj_list / sizeof *obj_list;

    for (int i = 0; i < size; ++i) {
        obj_list[i].Show();
    }
    return 0;
}

既定値ありのコンストラクタで初期化する

コンストラクタの引数に既定値を設定した場合は、曖昧さ回避のため引数なしのコンストラクタは定義できなくなります。

#include <iostream>
using namespace std;

class MyClass {
    int m_integer;
public:
    void Show();
    MyClass(int intval = 0);
};

MyClass::MyClass(int intval) {
    m_integer = intval;
}

void MyClass::Show() {
    cout << m_integer << endl;
}

int main() {
    MyClass obj, obj2(1);

    obj.Show();
    obj2.Show();

    return 0;
}

関数のデフォルト引数 (参考)

クラスとは関係ありませんが、既定値ありのコンストラクタと関連する事項のためここに記載します。関数にもデフォルト引数を設定することができます。ただし、クラスの場合と同様に二重定義の可能性があるオーバーロードはできません。

#include <iostream>
using namespace std;

int MyFunc(int arg1, int arg2 = 0); // プロトタイプ宣言がある場合、
                                    // デフォルト引数はこちらにのみ書く。
int MyFunc(int arg1, int arg2) {
    return arg1 + arg2;
}

// int MyFunc(int arg1) { // ← 二重定義となりエラーです。
//     return arg1;       // デフォルト引数による曖昧さ回避のため
// }                      // オーバーロードできません。

int main() {
    cout << MyFunc(1) << endl; //=> 1
    cout << MyFunc(1,1) << endl; //=> 2
    return 0;
}
関連ページ