【自主学習】ひたすらコードで覚えるC++［#6］

# はじめに
今回は6回目ということで必要な、様々な型について学んでいきます。
後半ではクラスの考え方について学んでいきます。

# 使用する環境
環境はVisual Studio 2022を使用します。

# typedefについて
typedefを使うことで既にある型に対して、別の名前をつけることができます。

```diff_c
typedef unsigned long int Count;

Count a = 5;
```

# 列挙型をつかう
列挙型```enum```を宣言することで、新しい型としてコード内で使うことができます。ここでは```num1```という値を```n```に代入して表示するプログラムになります。

```diff_c
#include <iostream>
using namespace std;

//列挙型number5の宣言
enum number5 { num1, num2, num3, num4, num5 };

int main() {
	number5 n;
	n = num1;

	switch (n)
	{
	case num1: cout << "1番です\n";
		break;
	case num2: cout << "2番です\n";
		break;
	case num3: cout << "3番です\n";
		break;
	case num4: cout << "4番です\n";
		break;
	case num5: cout << "5番です\n";
		break;
	default: cout << "番号はわかりません\n";
		break;
	}

	return 0;
}
```

# 構造体の仕組みを知る
構造体はユーザー定義型の一つで、異なる型をまとめることができます。

```diff_c
#include <iostream>
using namespace std;

//構造体型Carの宣言
struct Car {
	int num;
	double fuel;
};

int main() {
	Car car1;

	cout << "車のナンバーを入力してください。\n";
	cin >> car1.num;

	cout << "燃費を入力してください。\n";
	cin >> car1.fuel;

	cout << "車のナンバーは" << car1.num << "：燃費は" << car1.fuel << "km/Lです。\n";

	return 0;
}

```

# ポインタを関数の引数につかう
構造体へのポインタを関数の引数にすると、アドレスを渡すだけで関数が呼び出されます。その結果処理速度を向上させる場合があります。構造体へのポインタからメンバにアクセスする際、アロー演算子```->```を使うと便利です。

```diff_c
#include <iostream>
using namespace std;

//構造体型Carの宣言
struct Car {
	int num;
	double fuel;
};

//show関数の宣言
void show(Car* pC);

int main() {
	Car car1 = { 0, 0.0 };

	cout << "車のナンバーを入力してください。\n";
	cin >> car1.num;

	cout << "燃費を入力してください。\n";
	cin >> car1.fuel;

	show(&car1);

	return 0;
}

//show関数の定義
void show(Car* pC) {
	cout << "車のナンバーは" << pC->num << "：燃費は" << pC->fuel << "km/Lです。\n";
}


```

# 共用体の仕組みについて
共用体は限られたメモリを節約するために使われる型です。共用体のメンバはすべて同じ位置を共有するので、あるメンバの値を変更すると、ほかのメンバの値も同じものに変更されます。

```diff_c
#include <iostream>
using namespace std;

//共用体型Yearの宣言
union Date {
	int year;
	int month;
	int day;
};

int main() {
	Date mydate;

	cout << "西暦を入力してください。\n";
	cin >> mydate.year;

	cout << "西暦は" << mydate.year << "です\n";
	cout << "月は" << mydate.month << "です\n";

	cout << "月を入力してください。\n";
	cin >> mydate.month;

	cout << "月は" << mydate.month << "です\n";
	cout << "日付は" << mydate.day << "です\n";

	return 0;
}
```

# クラスについて
クラスを扱うときには、現実世界に存在する「モノ」などの概念に着目します。クラスの機能を活用することで複雑なプログラムを効率よく作成することができます。

```diff_c
#include <iostream>
using namespace std;

//Carクラスの宣言
class Car {
	public:
		int num;
		double fuel;
		void show();
};

//Carクラスメンバ関数の定義
void Car::show() {
	cout << "車のナンバーは" << num << "です。\n";
	cout << "燃費は" << fuel << "km/Lです。\n";
}

int main() {

	Car car1;

	car1.num = 1111;
	car1.fuel = 22.5;

	car1.show();

	return 0;
}
```

# メンバへのアクセスを制限
データと機能をひとまとめにして、メンバを保護する機能をカプセル化といいます。privateをつけることで変更したくないメンバを保護することができます。

```diff_c
#include <iostream>
using namespace std;

//Carクラスの宣言
class Car {
	private:
		int num;
		double fuel;
	public:
		void show();
		void setNumfuel(int n, double f);
};

//Carクラスメンバ関数の定義
void Car::show() {
	cout << "車のナンバーは" << num << "です。\n";
	cout << "燃費は" << fuel << "km/Lです。\n";
}
//setNumfuel関数の定義
void Car::setNumfuel(int n, double f) {
	if (f > 0 && f < 1000) {
		num = n;
		fuel = f;
		cout << "ナンバーは" << num << "燃費は" << fuel << "km/Lです。\n";
	}
	else {
		cout << f << "km/Lは正しい燃費の値ではありません。\n";
		cout << f << "燃費の値を変更できませんでした。\n";
	}
}

int main() {
	Car car1;

	car1.setNumfuel(1111, 25.3);
	car1.show();

	//無効な値が入力された場合
	cout << "正しくない燃費の値を指定します。\n";
	car1.setNumfuel(1111, -15.4);
	car1.show();

	return 0;
}

```







# 参考文献

この記事は以下の情報を参考にして執筆しました。
[やさしいC++ 第4版 (「やさしい」シリーズ) ](https://www.amazon.co.jp/%E3%82%84%E3%81%95%E3%81%97%E3%81%84C-%E7%AC%AC4%E7%89%88-%E3%80%8C%E3%82%84%E3%81%95%E3%81%97%E3%81%84%E3%80%8D%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E9%AB%98%E6%A9%8B-%E9%BA%BB%E5%A5%88/dp/4797370998)