より良いエンジニアを目指して

1日1つ。良くなる!上手くなる!

C++の場合は変数宣言しただけでオブジェクトが生成されることがある

C++の場合、以下のようにオブジェクトの変数宣言しただけで、オブジェクトが生成されることがあるのに気づいて驚きました。

MyClass obj1;
#include <iostream>
using namespace std;

class MyClass {
public:
    int data;
    MyClass() {
        data = 0;
    }
};

int main() {
    MyClass obj1;
    // 初期化してないけど!?
    cout << "obj1 = " << obj1.data << endl;
    return 0;
}

NullReferenceExceptionじゃないの!?と思いきや、上記のコードは正しく動作します。

C#Javaだったら、信じがたい挙動です。

f:id:rimever:20190815225953p:plain

ただし、以下のようにコンストラクタが引数必須の場合は、コンパイルエラーになります。

#include <iostream>
using namespace std;

class MyClass {
public:
    int data;
    MyClass(int data) {
        this->data = data;
    }
};

int main() {
    MyClass obj1;
    // これはコンパイルエラー
    cout << "obj1 = " << obj1.data << endl;
    return 0;
}

f:id:rimever:20190815230117p:plain

引数ある時は以下のようにします。

MyClass obj1(10);

f:id:rimever:20190818210546p:plain