オブジェクトと動的作成

■オブジェクトとインスタンス

クラスをデータ型とした変数を宣言したり、
この後説明するnewと呼ばれる動的確保関数を使用して
メモリ上にクラスの領域を確保できた実体のあるデータのことを
オブジェクトまたはインスタンスと呼びます。

■ローカル、グローバルオブジェクト

クラスは通常の変数と同様にローカル、グローバル宣言を行い
オブジェクトを作成することができます。
作成されたオブジェクトの寿命は通常の変数と同様です。

●ローカルオブジェクト
	関数の中で変数として宣言されたクラスをローカルオブジェクトと呼びます。
	ローカルオブジェクトの変数としての寿命はローカル変数と同じなので、
	宣言を行った行に作成され、最初の「}」で破棄されます。

	例:
		class Jugyoin
		{
		public:
			int m_Number;
		};

		void main(void)
		{
			// ローカルオブジェクト作成
			Jugyoin jugyoin;

			jugyoin.m_Number = 1001;
		}

●グローバルオブジェクト
	関数の外で変数として宣言したクラスをグローバルオブジェクトと呼びます。
	グローバルオブジェクトの変数はプログラム起動時に作成され、
	プログラム終了時に破棄されます。

	例:
		class Jugyoin
		{
		public:
			int m_Number;
		};

		// グローバルオブジェクト作成
		Jugyoin jugyoin;

		void main(void)
		{
			jugyoin.m_Number = 1001;
		}

■動的オブジェクト

動的とはプログラマー側でオブジェクトの作成と破棄を行うことで、
動的オブジェクトとは動的に作成されたオブジェクトのことです。
プログラム側でオブジェクトの作成と破棄を管理するためには
作成時にメモリの確保、破棄時にメモリの解放を行わなければいけません。
C言語でメモリの確保と解放を行うとしたらmalloc、free関数を使用していましたが、
C++言語ではnewとdelete演算子を使用します。
なぜならmallocやfreeでも確保と解放ができないわけではありませんが、
コンストラクタ、デストラクタが呼ばれないからです。
※newとdeleteとは関数ではなく演算子ですが、その点についてはここでは触れません。
 ここではnewでオブジェクトを作成し、deleteでオブジェクトを解放すると覚えてください。

●例
	class Test
	{
	public:
		Test(void);
		~Test(void);
	};

	Test::Test(void)
	{
		printf("コンストラクタ\n");
	}

	Test::~Test(void)
	{
		printf("デストラクタ\n");
	}

	void main(void)
	{
		Test *p1 = NULL;
		Test *p2 = NULL;

		p1 = new CTest();
		p2 = (Test*)malloc(sizeof(Test));

		delete(p1);
		free(p2);
	}

	実行結果:
		コンストラクタ
		デストラクタ

	上の例でnewとmalloc、deleteとfreeでCTestを作成、破棄を行っていますが、
	コンストラクタ、デストラクタは一度しか呼び出されておらず、
	その呼び出しはnewとdeleteが行っています。
	C++にとってコンストラクタ、デストラクタは魅力的な機能ですので、
	何かしらの理由がない限りはクラスを動的に扱う場合は
	new、deleteを使用した方がいいと思います。

●解放忘れに注意
	newとdeleteを行う場合そのオブジェクトの作成と破棄の管理は
	プログラム側で請け負います。
	すなわち、メモリの確保を行ったオブジェクトの
	メモリの解放を行う責任を負うということです。
	オブジェクトの破棄を忘れてしまったら
	メモリリークが発生してしてしまいますので、
	newを行ったらdeleteを行うということを忘れないようにしてください。

●new
	newはmallocと同じでメモリを動的に確保してくれます。
	mallocと異なるのはmallocはサイズ指定することに対し
	newは型指定で確保します。

	書式例:
		new データ型()	// ()はなしでも可

	例:
		// クラスデータCTest型のメモリを確保
		Test *test = new Test

	コンストラクタの指定:
		new演算子を使用した場合にデータ型に()を付けなかった場合は
		自動的にデフォルトコンストラクタが選択されます。
		もし、デフォルトコンストラクタ以外を指定したい場合は
		「new データ型」の後ろに「()」を付けて、その中に引数を追加し、
		使用するコンストラクタを決めます。
		※デフォルトコンストラクタ以外を使用する場合はクラスで
		 使用するコンストラクタの定義を行っている必要があります。

		例:
			class Test
			{
			public:
				Test(void);
				Test(int aaa);
				~Test(void);
			};

			Test::Test()
			{
				printf("コンストラクタ1\n");
			}

			Test::Test(int aaa)
			{
				printf("コンストラクタ2 aaa = %d\n", aaa);
			}

			Test::~Test(void)
			{
				printf("デストラクタ");
			}

			void main(void)
			{
				Test *p1;
				Test *p2;

					// デフォルトコンストラクタ
				p1 = new Test;
				// int型の引数を必要とするコンストラクタ
				p2 = new Test(100);
					delete(p1);
				delete(p2);
			}

●delete
	deleteはfreeと同じで動的に確保したメモリを解放します。
		
	書式例:
		delete 解放オブジェクト;

	具体例:
		Test *test = new Test;

		delete test;

●アロー演算子
	クラスデータ型のポインタのメンバにアクセスする場合は
	構造体と同じように「.」ではなく「->」(アロー演算子)を使用します。

	書式例:
		クラス変数名->メンバ

	具体例:
		class Test
		{
		public:
			int m_Val;
		};

		void main(void)
		{
			Test *test = new Test;
			test->m_Val = 1000;

			printf("%d\n" test->m_Val);

			delete test;
		}