1

私はC++の初心者です。私は以下のようなコードを持っています

#include <iostream>
#include <string>
#include <iomanip>

using namespace std;
int main()
{
   char sym[] = "Audi.Despo";
   //string sym ("Audi.Despo");
    string rs(sym);
    //cout << rs << endl;
    rs = string(sym,4);

 cout << rs;

    return 0;
}

変数symがchar配列の場合、文字列変数の最終出力はAudiです。

ただし、同じ変数symが文字列の場合、最終的な出力は.Despoです(接尾辞が出力されます)

説明は何ですか。

線のように見えます

rs = string(sym,4);

入力がchar[]または文字列の場合、動作を変更します。

4

3 に答える 3

4

これは、2つのコンストラクターオーバーロードの異なる実装です。

string ( const string& str, size_t pos, size_t n = npos );

コンテンツは、strのサブストリングのコピーに初期化されます。サブストリングは、文字位置posで始まり、最大n文字を占めるstrの部分です(strの終わりに到達する前にn未満になります)。

string ( const char * s, size_t n );

コンテンツは、sが指す文字の配列の最初のn文字によって形成される文字列のコピーに初期化されます。

于 2012-10-09T15:57:22.590 に答える
0
string ( const string& str, size_t pos, size_t n = npos );

std::string のコンストラクターの 2 番目の引数は、コンテンツの初期化に使用される部分文字列の開始位置です。

于 2012-10-09T15:59:25.430 に答える
0

あなたが言う時:

rs=string(sym, 4);

あなたがしていることは、「std::stringオブジェクトを作成してください。私 (プログラマー) は、この文字配列と数値を与えることで、あなた (プログラム) がそれを行うのを手伝います」と言っているのです。コード ビハインドstd::stringクラスは、文字配列と整数が与えられたインスタンスで、文字配列から示された文字数を取得し、std::stringその内容を使用して を構築する必要があることを認識しています。

あなたが言う時:

string rs2=string(rs, 4);

あなたが今していることは、「オブジェクトを作成してください。この既存のオブジェクトと番号std::stringを提供することで、それを行うのを手伝います」と言っているのです。この場合、クラスはまったく異なることを行います。これら 2 つの引数を受け取ると、代わりに数値を使用して、指定されたから読み取りを開始します。 std::stringstd::stringstd::string

これら 2 つの異なるケースは、クラスの 2 つの異なるコンストラクターです。これらは、利用可能な情報に基づいてオブジェクトを構築する 2 つの異なる方法を提供します。次の形式に変更することで、2 番目の例を最初の例と同じように簡単に動作させることができます。std::stringstd:string

string rs2=string(rs, 0, 4);

これで、「他の から文字を取得して、この新しいstd::string( と呼ばれるrs2) を初期化std::string rsします。インデックス 0 の文字 (つまり、最初の文字) から開始し、その後に 4 文字 (存在する場合) を取得してほしい」と伝えています。

クラスのオブジェクトを作成する前に、コンストラクターがどのように動作するかを知っておくことが重要です。すべてのstd::stringコンストラクターに関するドキュメントは、オンラインのさまざまな場所で検索して見つけることができます。

著者のメモ: この例では他にも多くのことが起こっており (代入演算子など)、多くの問題が隠されていることに注意してください。レベル。

于 2012-10-09T16:05:50.567 に答える