web-dev-qa-db-ja.com

パラメータとしての文字列?

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

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


int getString (string str1) {
    //code
}

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

6
ofey

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

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

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

11
Luchian Grigore

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

int getString(string const &str1)
{
}
9
user529758

はい、違いがあります。

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

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

2
slugonamission