関数のオーバーロード

■概要

関数のオーバーロードとはC++で実装できるようになった機能で、
同じ関数名であったとしても引数の情報が異なったら別の関数として
定義することができるという機能です。

●例
	class Jugyoin
	{
	public:
		void Init(void);
		void Init(int num, char *name, int salary);
		void ShowInfo(void);
	private:
		int m_Number;
		char m_Name[32];
		int m_Salary;
	};

	void Jugyoin::Init(void)
	{
		m_Number = 1001;
		strcpy_s(m_Name, "山田太郎");
		m_Salary = 220000;
	}

	void Jugyoin::Init(int num, char *name, int salary)
	{
		m_Number = num;
		strcpy_s(m_Name, name);
		m_Salary = salary;
	}

	void Jugyoin::ShowInfo(void)
	{
		printf("社員番号 = %d\n", m_Number);
		printf("名前 = %s\n", m_Name);
		printf("給料 = %d\n", m_Salary);
	}

	void main(void)
	{
		Jugyoin jugyoin;

		jugyoin.Init();
		jugyoin.ShowInfo();
		jugyoin.Init(1002, "佐藤一郎", 200000);
		jugyoin.ShowInfo();
	}

	実行結果:
		社員番号 = 1001
		名前 = 山田太郎
		給料 = 220000
		社員番号 = 1002
		名前 = 佐藤一郎
		給料 = 200000
	
	上記のソースではJugyoinクラスでInit関数を二つ宣言していますが、
	引数の内容が異なるのでコンパイラは別の関数として認識してエラーにはなりません。

■オーバーロードの注意点

オーバーロードの注意点としては戻り値のみ異なる場合はエラーになるということです。
以下のソースはエラーになります。

●例
	class Calc
	{
	public:
		int Divide(int num1, int num2);
		float Divide(int num1, int num2);
	};
			
	int Calc::Divide(int num1, int num2)
	{
		return num1 / num2;
	}

	float Calc::Divide(int num1, int num2)
	{
		return (float)num1 / num2;
	}

	void main(void)
	{
		Calc calc;
		int num = calc(10, 2);
	}
			
	これは関数名と引数が同じ場合は関数呼び出しの際どちらの関数を呼び出しているのかを
	コンパイラ側が判断できないためです。
	プログラマーが今回は戻り値がintのDivideを使用すると考えて使用したとしても
	コンパイラに与えられている情報だけでは正確な判断ができません。
	なので、オーバーロードが成立する内容としては引数が異なる場合にのみ成立します。