2
Bozo(const char * fname, const char * lname); // constructor prototype

この場合、次のように新しいオブジェクトを初期化するために使用します。

Bozo bozetta = Bozo("Bozetta", "Biggens"); // primary form
Bozo fufu("Fufu", "O’Dweeb"); // short form
Bozo *pc = new Bozo("Popo", "Le Peu"); // dynamic object

これに関していくつか質問があります。まず、char の前に const が必要なのはなぜですか? またはなぜそこにあるのですか?また、なぜポインタとして宣言しているのですか?

第二に、「基本形」と「短縮形」の間に何か違いはありますか?

3 番目の質問は、Java では仮パラメーターに文字列変数を使用しましたが、C++ では char であるということです。char には単一のアルファベットしか含めることができず、char 配列ではないと思いました。代わりに文字列でこれを行うことはできますか?

4

2 に答える 2

2

まず、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);
于 2013-09-12T07:28:16.133 に答える