プログラム基礎

後期課題

■ルール

	・コードの中で必要なインクルードファイルは定義していると仮定する
	・45問以上解答で合格
	・解答の形式は基本テキスト形式
	・ファイル名はTask_名前(ローマ字表記)

■問い1

	メンバ変数とはなんですか?

■問い2

	メンバ関数とはなんですか?

■問い3

	以下のプログラムはエラーが発生しますが、
	その原因を答えなさい

	class Character
	{
	public:
		int m_Hp;
		int m_Mp;
		int m_Attack;
		int m_Deffence;
	}

	void main(void)
	{
		Character ch;
		ch.m_Hp = 10;
	}

■問い4

	関数のオーバーロードとはなんですか?

■問い5

	以下はAddSum関数のオーバーロードの宣言です。
	この宣言が原因でエラーが発生しますが、どの関数が原因となっているでしょう?
	※1.定義部分にはエラーはないと仮定します。
	※2.複数回答可

		①.int AddSum(int a, int b);
		②.float AddSum(float a, float b);
		③.short AddSum(short a, short b);
		④.int AddSum(int a, float b);
		⑤.char AddSum(short a, short b);

■問い6

	問い5のエラーの原因を答えなさい

■問い7

	コンストラクタの目的を答えなさい

■問い8

	デストラクタの目的を答えなさい

■問い9

	以下のプログラムはエラーが発生しますが、
	原因を答えなさい

	class Test
	{
	public:
		void Test()
		{
		}

		void PrintHelloWorld()
		{
			printf("HelloWorld\n");
		}
	};

	void main(void)
	{
		Test t;
		t.PrintHelloWorld();
	}

■問い10

	デフォルトコンストラクタとはなんですか?

■問い11

	以下のクラスを生成時にm_Hpとm_Mpの値を生成側が指定できるように修正しなさい。
	※今のコンストラクタはそのまま残しておくこと

	class Character
	{
	public:
		Character()
		{
			m_Hp = 10;
			m_Mp = 5;
		}

		int m_Hp;
		int m_Mp;
	};

	void main(void)
	{
		Character ch;
		printf("HP = %d\nMP = %d\n", ch.m_Hp, ch.m_Mp);
	}

■問い12

	以下のクラス変数「ch」のデストラクタが呼び出されるのは
	①~⑤のどこでしょうか?

	class Character
	{
	public:
		
		①Character()
		{
		}

		②~Character()
		{
		}
	};

	void main(void)
	{
		srand(NULL);
		int num = rand() % 10;

		if (num >= 5)
		{
			③Character ch;
		④}

	⑤}

■問い13

	インスタンスとはなんですか?

■問い14

	インスタンスとオブジェクトの違いを答えなさい

■問い15

	インスタンス化とはなんですか?

■問い16

	動的オブジェクトと静的オブジェクトの違いを答えなさい

■問い17

	動的オブジェクトを使用する上でメリットとデメリットを答えなさい

■問い18

	以下のコードはエラーになりますが、原因を答えなさい

	class Character
	{
	public:
		Character()
		{
			m_Hp = 10;
			m_Mp = 3;
		}

		int m_Hp;
		int m_Mp;
	};

	void main(void)
	{
		Character *ch = new Character();

		printf("HP = %d\n", ch.m_Hp);
	}

■問い19

	アクセス指定子「public」で指定されたメンバの使用可能範囲を答えなさい

■問い20

	アクセス指定子「private」で指定されたメンバの使用可能範囲を答えなさい

■問い21

	アクセス指定子「protected」で指定されたメンバの使用可能範囲を答えなさい

■問い22

	以下のメンバを指定したアクセス指定子で宣言しなさい

	クラス名:
		Character
	メンバ:
		int型 m_Hp => private
		int型 m_Mp => private
		int型 m_Attack => private

		コンストラクタ => public
			引数:
				なし
			内容:
				m_Hpに100
				m_Mpに50
				m_Attackに10を代入する

		PrintParameter関数 => public
			引数:
				なし
			戻り値:
				なし
			内容:
				メンバ変数を全て出力する

■問い23

	アクセサについて説明せよ

■問い24

	ゲッターについて説明せよ

■問い25

	セッターについて説明せよ

■問い26

	以下のゲッターはアクセサとしては間違っています。
	原因を答えなさい

	class Character
	{
	public:
		Character() {}
	private:
		int m_Hp;
		int m_Mp;
		
		int GetHp() { return m_Hp; }
		int GetMp() { return m_Mp; }
	};

■問い27

	カプセル化とはなんですか?

■問い28

	継承とはなんですか?

■問い29

	継承元クラスの別名を3つ以上答えなさい

■問い30

	継承先クラスの別名を3つ以上答えなさい

■問い31

	汎化とはなんですか?

■問い32

	汎化のメリットを答えなさい。
	※問い31にメリットを記述している場合、
	 その旨を記述しなさい

■問い33

	以下のクラスから汎化したクラスCharaBaseを作成しなさい
	※メンバ関数の定義を行う必要はありません。

	class Player
	{
	public:
		void LevelUp();
		void Init();
		void Control();
		void Draw();
	private:
		float m_PosX;		// 座標
		float m_PosY;		// 座標
		int m_LayerId;		// レイヤーID
		float m_Scale;		// 拡縮サイズ
		float m_Angle;		// 回転角度
		int m_Money;		// お金
		int m_Exp;		// 経験値
		int m_Hp;		// HP
		int m_Mp;		// MP
		int m_At;		// 攻撃力
		int m_Deff;		// 守備力
		int m_Level;		// レベル
	};

	class Enemy
	{
	public:
		void Init();
		void Control();
		void Draw();
		void AiRun();
	private:
		float m_PosX;		// 座標
		float m_PosY;		// 座標
		int m_LayerId;		// レイヤーID
		float m_Scale;		// 拡縮サイズ
		float m_Angle;		// 回転角度
		int m_Money;		// お金
		int m_Exp;		// 経験値
		int m_RaceId;		// 種族ID
		int m_RaceSubId;	// 種族サブID
		int m_Hp;		// HP
		int m_Mp;		// MP
		int m_At;		// 攻撃力
		int m_Deff;		// 守備力
	};

■問い34

	問い32で作成したCharaBaseクラスを継承したPlayerクラスと
	Enemyクラスを作成しなさい

■問い35

	以下のクラスの継承の順番の場合、コンストラクタが呼び出される順番を答えなさい

		ObjectBase => CharacterBase => EnemyBase => Slime

■問い36

	以下のクラスの継承の順番の場合、デストラクタが呼び出される順番を答えなさい

		ObjectBase => CharacterBase => EnemyBase => Slime

■問い37

	アップキャストとはなんですか?

■問い38

	アップキャストを行った場合、以下のように明示的にキャストを行わなくていい理由を答えなさい

		class CharaBase
		{
		};

		class Player : public CharaBase
		{
		};

		void main(void)
		{
			Player pl;
			CharaBase *ch = &pl;
		}

■問い39

	関数のオーバーライドとはなんですか?

■問い40

	Kadenクラスを継承したクラスYodobashiを作成し、
	以下の出力結果になるように必要な処理を記述しなさい

	class Kaden
	{
	public:
		void PrintShopName()
		{
			printf("家電店\n");
		}
	};

	出力
		家電店
		ヨドバシ

■問い41

	仮想関数とはなんですか?

■問い42

	純粋仮想関数とはなんですか?

■問い43

	純粋仮想関数を定義するメリットを答えなさい

■問い44

	アップキャストした場合、継承先のメンバは使用できません。
	その理由を答えなさい

■問い45

	多態性を利用して以下の出力結果になるように
	必要な処理を記述しなさい。
	※各クラスに関しても必要な処理を全て書いている保障はありません。

		クラス:
			class BookShop
			{
			public:
			};

			class Junkdo : public BookShop
			{
			public:
				void PrintShopName()
				{
					printf("ジュンク堂\n");
				}
			};

			class Kinokuniya : public BookShop
			{
			public:
				void PrintShopName()
				{
					printf("紀伊国屋\n");
				}
			};

			class Book1st : public BookShop
			{
			public:
				void PrintShopName()
				{
					printf("Book1St\n");
				}
			};

		出力結果:
			紀伊国屋
			Book1st
			ジュンク堂

■問い46

	ポリモーフィズムのメリットを答えなさい

■問い47

	デフォルト引数とはなんですか?

■問い48

	以下のクラスのコンストラクタを修正し、
	デフォルト引数を使用してm_Hpとm_Mpに対して
	実引数無しでも動作するようにしなさい

		デフォルトの値
			m_Hp => 100
			m_Mp => 50

		class Character
		{
		public:
			Character(int hp, int mp)
			{
				m_Hp = hp;
				m_Mp = mp;
			}
		private:
			int m_Hp;
			int m_Mp;
		};

■問い49

	以下の処理のエラーの原因を答えなさい。

		class Character
		{
		public:
			Character(int hp = 100, int mp)
			{
				m_Hp = hp;
				m_Mp = mp;
			}
		private:
			int m_Hp;
			int m_Mp;
		};

		void main(void)
		{
			Character ch(100, 50);
		}

■問い50

	以下のクラスの問題点を答えなさい。

	class CharaBase
	{
	public:
		CharaBase()
		{}
		~CharaBase()
		{}
	protected:
		int m_Hp;
		int m_Mp;
	};

	class Player : public CharaBase
	{
	public:
		Player()
		{
			m_MagicIdList = new int[10];
		}
		~Player() 
		{
			delete [] (m_MagicIdList);
		}
	private:
		int m_Level;
		int *m_MagicIdList;
	};

	void main(void)
	{
		CharaBase *pl = new Player();
		delete(pl);
	}

■問い51

	問い50の問題が発生する理由を答えなさい

■問い52

	メンバイニシャライザとはなんですか?

■問い53

	メンバイニシャライザのメリットを答えなさい

■問い54

	以下のコードでメンバイニシャライザの初期化順番を答えなさい

	class Character
	{
	public:
		Character() :
			m_Hp(0),
			m_Mp(0),
			m_Def(0),
			m_At(0)
		{}
	private:
		int m_Hp;
		int m_Mp;
		int m_At;
		int m_Def;
	};

	1番目:
	2番目:
	3番目:
	4番目:

■問い55

	以下のクラスに対してメンバイニシャライザを追加しなさい

	class Drawer
	{
	public:
		Drawer(float posx, float posy)
		{
		}
	protected:
		float m_PosX;
		float m_PosY;
	};

	class CharacterBase : public Drawer
	{
	public:
		CharacterBase(float posx, float posy, int hp, int mp)
		{
		}
	private:
		int m_Hp;
		int m_Mp;
	};

■問い56

	インラインのメリットを答えなさい

■問い57

	インラインのデメリットを答えなさい

■問い58

	インライン展開されないケースについて答えなさい

■問い59

	以下のクラスで宣言されているGetPosXをインライン関数にしなさい

	class Drawer
	{
	public:
		float GetPosX();
		float GetPosY();
	private:
		float m_PosX;
		float m_PosY;
	};

	float Drawer::GetPosX()
	{
		return m_PosX;
	}

	float Drawer::GetPosY()
	{
		return m_PosY;
	}
	

■問い60

	HelloWorldと出力するプログラムを書きなさい