補足説明 1 サンプルプログラムの構成 文字列処理用のモジュール str.h クラスの宣言 を記述 #include “str.h” main.cpp メインルーチン 分割コンパイルができなくな るので、ヘッダファイルには 実装は書かない #include “str.h” str.cpp クラスに含まれる メンバ関数の 本体を記述 Stringクラスのメンバ関数に スコープ String:: を書くのを忘 れない char& String::getChar(int i) { } 2 ヘッダファイルの中身 二重インクルードの防止措置 #ifndef __MYSTR__ もし、 __MYSTR__ が定義されていな #define __MYSTR__ かったら、以下を定義しますよ。すでに定 class String { 義されていたら、定義が重複しないように 読み飛ばしますよ。 char *s; __MYSTR__の部分はプログラムを public: 書く人が決めた文字列 String(); String(const char* n); String(const String& ref); ~String(); void printString(); char& getChar(int i); }; #endif 3 &や*を書く位置について char &getChar(int i); ←教科書準拠書式 char& getChar(int i); ←これでも同じ char & getChar(int i); ←これでも同じ スペースの位置の違い String(const char *n); ←教科書準拠書式 String(const char* n); ←これでも同じ String(const char * n); ←これでも同じ 4 コンストラクタ1 オブジェクトの 初期化を自動で やりたいな はい, コンストラクタ String a; 引数のないコンストラクタを デフォルトコンストラクタという 初期値を入れておかないと a.printString() したときエラーになるな… a s String() { s = new char[1]; *s = '\0'; } char1個分 確保している点 に注目 a s \0 5 コンストラクタ2 なぜ,いろいろコンストラクタを用意するの? →状況に応じて初期化の仕方を変えたいから String b(“hello”); 指定された文字列を 初期値に設定したい b s String(const char *n) { s = new char[strlen(n) + 1]; strcpy(s, n); } b h e l l o \0 s h e l l o \0 6 コピーコンストラクタ メンバ変数にポインタ変数が 含まれているときなど 単純にオブジェクトを複製すると問題があるときのため に,初期化時の複製の仕方を定義するのがコピーコン ストラクタ String c = b; c String(const String& ref) { s = new char[strlen(ref.s) + 1]; strcpy(s, ref.s); } c s s h e l l o \0 s h e l l o \0 同じところを指さない よう注意しなくちゃ b s h e l l o \0 b 7 デストラクタ はい, デストラクタ オブジェクトの 後片付けを自動で やりたいな ~String() { delete [] s; } String a; a s \0 ちゃんと解放してから終了し ないとメモリリークする 8 参照 参照を渡さないと 参照を渡すと function(const String val); function(const String& ref); 関数等の内部で一時的にオブ ジェクトの複製が作られる. →オブジェクトが大きいとき処理 が重くなる 直接,元のオブジェクトを見に行く a val s \0 s \0 関数等の内部 a s ref \0 関数等の内部 9
© Copyright 2024 ExpyDoc