構造体のように初期化する (非推奨)
#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;
}
0
記事の執筆者にステッカーを贈る
有益な情報に対するお礼として、またはコメント欄における質問への返答に対するお礼として、 記事の読者は、執筆者に有料のステッカーを贈ることができます。
さらに詳しく →Feedbacks
ログインするとコメントを投稿できます。
関連記事
- ダウンキャスト (C++をもう一度)実行時型情報 RTTI #include <iostream> #include <typeinfo> using namespace std; class MyClass { public: virtual ~MyClass() {} // typeid で正しい RTTI // (RunTime Type Information; 実行時型情報) ...
 - 競技プログラミングの基本処理チートシート (C++)限られた時間の中で問題を解くために必要となる、競技プログラミングにおける基本的な処理のチートシートです。競プロにおけるメジャー言語 C++ を利用します。その際 C++11 の機能は利用せず C++03 の機能の範囲内で記述します。 頻度高く定期的に開催されるコンテスト AtCoder Codeforces main.cpp #include <iostream>
 - 構造体と列挙体 (C++をもう一度)構造体 #include <iostream> using namespace std; struct MyStruct { char charval; int intval; }; void Show(MyStruct* obj) { cout << obj->intval << endl; } int main() { ...
 - Valgrind による C/C++ メモリリーク検出JVM メモリリークでは JDK の jstat や jmap で原因を調査できます。C/C++ では valgrind の Memcheck ツールが利用できます。valgrind には複数のツールが含まれており既定のツールが Memcheck です。他のツールを利用する場合は --tool オプションで指定します。 [簡単な利用例](h
 - Union-Find サンプル『プログラミングコンテストでのデータ構造』で紹介されている Union-Find 木で集合を表現すると、以下のクエリを高速に実行できます。集合一つが一つの木となるため、複数の集合がある場合は全体として森になります。 ある要素 a_i と a_j が同じ集合に属しているかどうかの判定 二つの集合を一つの集合にまとめる サンプル [POJ 1182](https://translat
 



