Menu
Coddy logo textTech

まとめ - Stringクラス

CoddyのC++ジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 26/104。

challenge icon

チャレンジ

簡単

独自の動的文字配列を管理する完全な String クラスを構築しましょう。この章で学んだすべてのコンストラクタとデストラクタの概念を統合します。これは、std::string が内部でどのように動作するかを反映した古典的な演習です。

コードを整理するために、2つのファイルを作成します:

  • String.h: 「Rule of Five(5のルール)」に従って String クラスを定義します。クラスは data という名前の char* ポインタと size_t length メンバを管理する必要があります。以下を実装してください:
    • デフォルトコンストラクタ: 空の文字列を作成します(ヌル終端文字用に1文字分を割り当て、長さを0に設定)。"Default constructed" と出力します。
    • 引数付きコンストラクタ: const char* を受け取り、C言語スタイルの文字列を新しく割り当てたメモリにコピーします。"Constructed: <text>" と出力します。
    • コピーコンストラクタ: 別の String のディープコピーを実行します。"Copied: <text>" と出力します。
    • ムーブコンストラクタnoexcept を指定): 所有権を移譲します。ソースをヌルにする前のテキストを使用して "Moved: <text>" と出力します。
    • デストラクタ: メモリを安全に解放します(ヌルチェックを行うこと)。"Destroyed: <text>" と出力します(data がヌルまたは length が 0 の場合は "Destroyed: (empty)" と出力します)。
    • size() メソッド: 長さを返します。
    • c_str() メソッド: 文字ポインタを返します(ヌルの場合は "" を返します)。
  • main.cpp: すべてのコンストラクタが連携して動作することを実証します。入力からテキスト文字列を読み取り、以下の処理を行います:
    • デフォルトコンストラクタを使用して s1 という名前の String を作成します。
    • 入力テキストを使用して s2 という名前の String を作成します。
    • s2 をコピーして s3 という名前の String を作成します。
    • s2 からムーブして s4 という名前の String を作成します。
    • "--- Status ---" と出力します。
    • 各文字列(s1 から s4)について、"s<n>: \"<text>\" (length: <len>)" と出力します。

効率化のため、すべてのコンストラクタで初期化リストを使用してください。ムーブの後、s2 は長さ 0 の空の状態になり、s4 が元のテキストを保持している必要があります。最後に表示されるデストラクタのメッセージは、4つのオブジェクトすべてが作成の逆順でクリーンアップされることを示します。

strlenstrcpy のために <cstring> を、std::move() のために <utility> をインクルードしてください。ヘッダーファイルにはヘッダーガードを忘れないようにしてください。

自分で試してみよう

#include <iostream>
#include <string>
#include "String.h"

using namespace std;

int main() {
    string input;
    getline(cin, input);

    // TODO: デフォルトコンストラクタを使用して String s1 を作成する

    // TODO: 入力テキストを使用して String s2 を作成する

    // TODO: s2 をコピーして String s3 を作成する

    // TODO: s2 からムーブして String s4 を作成する (std::move を使用)

    // ステータスヘッダーを表示する
    cout << "--- Status ---" << endl;

    // TODO: s1 から s4 の各文字列のステータスを表示する
    // 形式: "s<n>: \"<text>\" (length: <len>)"

    return 0;
}

オブジェクト指向プログラミングのすべてのレッスン