まず、char の前に const が必要なのはなぜですか? またはなぜそこにあるのですか?また、なぜポインタとして宣言しているのですか?
最初に最後の質問に答えることから始めます。これはポインターとして宣言されているため、コンストラクターは文字の配列を受け入れることができます。はconst
、指している文字がこのbozo
コンストラクター内で変更されていないことを示すためにあります。これは重要です。例の使用法は、通常、プログラムの読み取り専用メモリ部分に存在する C スタイルの文字列リテラルを渡すことができるためです。このような文字列リテラルを変更しようとする試みは、未定義の動作です。
第二に、「基本形」と「短縮形」の間に何か違いはありますか?
Bozo
最初の形式は、右側で一時オブジェクトを作成し、そのオブジェクトを使用しbozetta
て左側で初期化します。このフォームでは余分なコピーが発生すると思うかもしれませんが、そうではありません。C++ 標準は、コンパイラが を省略して構築中にこの不要な余分なコピーをスキップできるように表現されています。実際には、最新のすべての C++ コンパイラでこれを試してみると、上で示したプロトタイプを使用して構築されることがわかりますbozetta
。余分なコピーは発生しません。
2 番目の形式は、2 つの文字列リテラルをパラメーターとして受け入れることができるコンストラクターをBozo
使用して、オブジェクトを明示的に構築します。Bozo
これら 2 つの形式は、コンストラクターが宣言されていないと仮定すると、同じ動作をしexplicit
ます。
char には単一のアルファベットしか含めることができず、char 配列ではないと思いました。
その通りです。 achar
は 1 バイト分の情報しか保持できません。C と C++ には実際のネイティブ文字列型がなく、他の言語で好んで使用されている型とは異なります。chars
したがって、「文字列」は実際にはメモリの偶発的なブロックに配置された単なる束です。上記のコンストラクBozo
ターは、ブロックの開始位置へのポインターを入力として取得することで、このブロックを操作できます。
代わりに文字列でこれを行うことはできますか?
はい、できます。実際には、 を使用してこれを行うのが望ましい方法ですstd::string
。コンストラクタ宣言は次のようになります。
Bozo(std::string fname, std::string lname);
// or to avoid potential copying of long strings
Bozo(const std::string &fname, const std::string &lname);