C++デフォルト初期化

11764 ワード

変数を定義するときに初期値が指定されていない場合、変数はデフォルトで初期化され、変数にはデフォルト値が与えられ、デフォルト値は変数タイプと位置によって決定されます.
組み込みタイプのデフォルト初期化
関数体外初期化は0であり,関数体内は初期化されずnew初期化を用いた値はランダムである.
int g_value;
 
int main(void)
{
	int value;//C4700	            “value”
	int* newValue = new int;
	std::cout << *newValue << std::endl;
	std::cout << g_value << std::endl;
	std::cout << value << std::endl;
	system("pause");
	return 0;
}

クラスタイプのデフォルト初期化
クラス変数を定義しますが、初期値が指定されていない場合、デフォルトのコンストラクタを使用して初期化されます.したがって、デフォルトのコンストラクタがないクラスはデフォルト初期化できません.関数体外で定義されたクラス変数は、windowsのmainCRTStartupなどのモジュールエントリポイントで初期化されます.
関数の外側に定義されたクラス変数については、ゼロ初期化を行い、デフォルト初期化を実行します.
//         
class Worker
{
public:
	int height;
};


//            
class Person
{
public:
	int height;
	Person() {};
};

Worker g_worker;
Person g_person;

int main()
{
	//Worker localWorker;//error C4700:             “localWorker”
	Person localPerson;
	std::cout << g_worker.height << std::endl;//0
	std::cout << g_person.height << std::endl;//0
	std::cout << localPerson.height << std::endl;//   
	system("pause");
	return 0;
}


配列のデフォルト初期化
配列を定義するときに初期化リストが提供される場合、未定義の要素が内蔵タイプまたは合成されたデフォルトコンストラクタのあるクラスタイプの場合、ゼロ初期化が先に実行され、要素がクラスタイプの場合、デフォルトコンストラクタが実行されます.初期化リストが指定されていない場合、各要素はデフォルトの初期化を使用します.
class Worker
{
public:
	int height;
};
int main()
{
	int array1[5];
	for (int i = 0; i < 5; i++) {
		std::cout << array1[i] << std::endl;//   
	}

	int array2[5] = { 1,2 };
	for (int i = 0; i < 5; i++) {
		std::cout << array2[i] << std::endl;//1,2,0,0,0
	}

	int array3[5] = {};
	for (int i = 0; i < 5; i++) {
		std::cout << array3[i] << std::endl;//0,0,0,0,0
	}

	Worker *worker = new Worker;
	Worker array4[5] = { *worker };
	for (int i = 0; i < 5; i++) {
		std::cout << array4[i].height << std::endl;//   ,0,0,0,0
	}
	system("pause");
	return 0;
}