Document

補足説明
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