参照の返しの復習とコピーコンストラクタ

これまで、intやchar *を返す関数をよく扱ってきましたが、関数から”参照”を返すこともできます。

参照の返しの復習(p.139〜)

コピーコンストラクタ(p.154〜)

C++では1つのオブジェクトを別のオブジェクトに渡す状況として、”代入”と”初期化”があります。代入の方法を指定するには、次に学習する”代入演算子のオーバーロード”を行えばよいので、ここでは触れません。

”初期化”は以下の場合に発生します。

  1. 宣言文でオブジェクトを使用して他のオブジェクトを宣言するとき
  2. 関数に仮引数としてオブジェクトを渡すとき
  3. 関数の戻り値として使用する一時オブジェクトを作るとき

初期化の方法を指定するのはコンストラクタでしたね。コピーコンストラクタは、初期化のときに起こりうるちょっと困った状況に対処するために作成するコンストラクタです。

練習課題1

以下は、初級編で使用した文字列クラスのソースコードをもとに作成したものである。

必須 (このプロジェクトは再度使用するので、必ず完成させておくこと。)

  1. プロジェクト名をp3kadai2w1として、新規作成し、以下の3つのファイルをプロジェクトに追加しなさい
  2. 出力の部分(printfを使っている部分)をcoutを使うように変更しなさい。
  3. 改行は\nではなく、endlを使うよう変更しなさい。
  4. i 文字目の文字の参照を返すメンバ関数getCharを追加しなさい。
  5. コピーコンストラクタを追加しなさい。
  6. 4と5で追加した機能が正しく動作しているか確認しなさい。

余力のある人は

  • getCharを改良し、i が文字列長の範囲外だった場合エラーメッセージを出力してプログラムを終了するよう変更しなさい。
  • getCharを参照を返さないように変更するとどうなるか試してみなさい。
  • コピーコンストラクタをコメントアウトすると何が起きるか試してみなさい。
  • cinを使って、文字列を入力できるよう変更しなさい。

ヒント

  • 入力された文字列を一時保管するための配列が必要。(例: list1.cppの10行目)
  • 入力された文字列をStringクラスのメンバ変数sに格納するために、void setString(const char* n)のようなメンバ関数を作成する。

str.h

str.cpp

main.cpp