7

文字列を変更しない場合は、最初のオプションの方が良いか、両方とも同じです-(文字列を反復処理したいのですが、文字列のサイズが大きいため、ローカルコピーを作成したくありません)。

int getString(string& str1) {
    //code
}


int getString (string str1) {
    //code
}

そして、文字列を変更する予定がある場合、2つの間に違いはありますか?文字列がC++で不変であるためですか?

4

3 に答える 3

12

const参照を渡してみませんか?この方法では、コピーは作成されず、呼び出された関数は文字列を変更できません。

int getString(string const &str1)
{
}
于 2013-02-04T19:11:49.370 に答える
12

文字列リテラルは不変ですが、std::stringsは不変ではありません。

1つ目は参照渡しです。文字列を変更する予定がない場合は、const参照して渡します。

2つ目は値渡しです。関数内の文字列を変更すると、コピーのみが変更されるため、意味がありません。

于 2013-02-04T19:11:52.507 に答える
2

はい、違いがあります。

2番目のバリアント(&)なしでは、文字列を値ごとに関数のスコープにコピーgetStringします。これは、行った更新が発信者のコピーではなく、ローカルコピーに影響することを意味します。これは、古い値(std::string(std::string& val))を使用してクラスのコピーコンストラクターを呼び出すことによって行われます。

一方、最初のバリアント(&)は参照を通過するため、ローカル変数を変更すると、参照がconstとしてマークされていない限り(この場合、値を変更できません)、呼び出し元の変数が変更されます。文字列を変更しない場合はコピー操作を行う必要がないため、これはより高速です。

于 2013-02-04T19:12:30.787 に答える