これまで、intやchar *を返す関数をよく扱ってきましたが、関数から”参照”を返すこともできます。
C++では1つのオブジェクトを別のオブジェクトに渡す状況として、”代入”と”初期化”があります。代入の方法を指定するには、次に学習する”代入演算子のオーバーロード”を行えばよいので、ここでは触れません。
”初期化”は以下の場合に発生します。
初期化の方法を指定するのはコンストラクタでしたね。コピーコンストラクタは、初期化のときに起こりうるちょっと困った状況に対処するために作成するコンストラクタです。
以下は、初級編で使用した文字列クラスのソースコードをもとに作成したものである。
必須 (このプロジェクトは再度使用するので、必ず完成させておくこと。)
- プロジェクト名をp3kadai2w1として、新規作成し、以下の3つのファイルをプロジェクトに追加しなさい
- 出力の部分(printfを使っている部分)をcoutを使うように変更しなさい。
- 改行は\nではなく、endlを使うよう変更しなさい。
- i 文字目の文字の参照を返すメンバ関数getCharを追加しなさい。
- コピーコンストラクタを追加しなさい。
- 4と5で追加した機能が正しく動作しているか確認しなさい。
余力のある人は
- getCharを改良し、i が文字列長の範囲外だった場合エラーメッセージを出力してプログラムを終了するよう変更しなさい。
- getCharを参照を返さないように変更するとどうなるか試してみなさい。
- コピーコンストラクタをコメントアウトすると何が起きるか試してみなさい。
- cinを使って、文字列を入力できるよう変更しなさい。
ヒント
- 入力された文字列を一時保管するための配列が必要。(例: list1.cppの10行目)
- 入力された文字列をStringクラスのメンバ変数sに格納するために、void setString(const char* n)のようなメンバ関数を作成する。
str.h
includeSrcWithFrame("page1/str.h", 4, "", false, true); ?>str.cpp
includeSrcWithFrame("page1/str.cpp", 4, "", false, true); ?>main.cpp
includeSrcWithFrame("page1/main.cpp", 4, "", false, true); ?>