まとめ - Stringクラス
CoddyのC++ジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 26/104。
チャレンジ
簡単独自の動的文字配列を管理する完全な 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()メソッド: 文字ポインタを返します(ヌルの場合は""を返します)。
- デフォルトコンストラクタ: 空の文字列を作成します(ヌル終端文字用に1文字分を割り当て、長さを0に設定)。
main.cpp: すべてのコンストラクタが連携して動作することを実証します。入力からテキスト文字列を読み取り、以下の処理を行います:- デフォルトコンストラクタを使用して
s1という名前のStringを作成します。 - 入力テキストを使用して
s2という名前のStringを作成します。 s2をコピーしてs3という名前のStringを作成します。s2からムーブしてs4という名前のStringを作成します。"--- Status ---"と出力します。- 各文字列(s1 から s4)について、
"s<n>: \"<text>\" (length: <len>)"と出力します。
- デフォルトコンストラクタを使用して
効率化のため、すべてのコンストラクタで初期化リストを使用してください。ムーブの後、s2 は長さ 0 の空の状態になり、s4 が元のテキストを保持している必要があります。最後に表示されるデストラクタのメッセージは、4つのオブジェクトすべてが作成の逆順でクリーンアップされることを示します。
strlen と strcpy のために <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;
}
オブジェクト指向プログラミングのすべてのレッスン
3コンストラクタとデストラクタ
デフォルトコンストラクタ引数付きコンストラクタコピーコンストラクタムーブコンストラクタコンストラクタ初期化リスト委譲コンストラクタデストラクタ詳解Rule of Three / Five / Zeroまとめ - Stringクラス6演算子オーバーロード
演算子オーバーロード入門算術演算子のオーバーロード比較演算子のオーバーロードストリーム演算子代入演算子のオーバーロード[] と () 演算子のオーバーロード型変換演算子まとめ:Matrix クラス