2

私は C++ の初心者で、Accelerated C++ について言及しています。言うその練習問題の1つを試している間:

Are the following definitions valid? Why or why not?
const std::string exclam = "!";
const std::string message = "Hello" + ", world" + exclam;

プログラムを試して実行すると、次のようなエラーが発生します。

二項演算子 + の型の無効なオペランド。

しかし、次のコードは問題なく動作します。

const std::string hello = "Hello";
const std::string message = hello + ", world" + "!";

私はその実行について明確ではありません!最初のケースでこの連結が機能しないのはなぜですか?

ありがとう!私は DEV C++ を使用しています。

4

4 に答える 4

3

これ"Hello"は、コンパイラがそれを読み取るときに、 ではないためですstd::stringが、const char *- には使用できないためです+

次の方法で簡単に修正できます。

 const std::string message = std::string("Hello") + ... 
于 2013-05-15T15:54:46.037 に答える
1

"Hello"type のオブジェクトではないという意味で、文字列ではありませんstd::string。文字の配列である文字列リテラルです。2 つのリテラルを と連結することはできませんが+、 astd::stringと配列を連結することはできます (その逆も可能です)。

"Hello" + ", world" + exclamは と同等("Hello" + ", world") + exclamであり、2 つのリテラルを連結しようとするため機能しません。+ただし、演​​算子なしでそれらを連結できます。"Hello" ", world" + exclam

hello + ", world" + "!";と同等(hello + ", world") + "!"です。std::stringaとリテラルを連結します。結果は newstd::stringで、2 番目のリテラルと連結されます。両方の連結が可能です。

その理由は、C++ が過去半世紀ほどにわたってゆっくりと進化してきた言語ファミリーのメンバーであり、いまだに端に古代言語の名残が残っているためです。

于 2013-05-15T15:58:59.847 に答える
0

"Hello"最初の", world"例は const char* オブジェクトです。論理的には問題ないように見えますが、ポインターの性質上、2 つの文字配列を一緒に加算する方法は定義されていません。

2 番目の例では、hello は std::string オブジェクトであり、+ 演算子が定義されているため、次のように記述します。

hello + ", world"

両方のコンテンツを含む新しい std::string オブジェクトを作成します。

于 2013-05-15T15:58:43.807 に答える