文字列を変更しない場合は、最初のオプションの方が良いか、両方とも同じです-(文字列を繰り返し処理したいのですが、文字列のサイズが大きいため、ローカルコピーは必要ありません作られる。)
int getString(string& str1) {
//code
}
int getString (string str1) {
//code
}
そして、文字列を変更する予定がある場合、2つの間に違いはありますか?文字列はC++で不変であるためですか?
文字列リテラルは不変です、std::string
sはそうではありません。
1つ目は参照渡しです。文字列を変更する予定がない場合は、const
参照で渡します。
2つ目は値渡しです。関数内の文字列を変更すると、コピーのみが変更されるため、意味がありません。
Const参照を渡してみませんか?この方法では、コピーは作成されず、呼び出された関数は文字列を変更できません。
int getString(string const &str1)
{
}
はい、違いがあります。
2番目のバリアント(_&
_なし)は、getString
関数のスコープに値ごとに文字列をコピーします。つまり、行った更新は、呼び出し元のコピーではなく、ローカルコピーに影響します。これは、古い値(std::string(std::string& val)
)を使用してクラスのコピーコンストラクターを呼び出すことによって行われます。
一方、最初のバリアント(_&
_を使用)は参照によって渡されるため、参照がconstとしてマークされていない限り、ローカル変数を変更すると呼び出し元の変数が変更されます(この場合、値は変更できません)。 。文字列を変更しない場合はコピー操作を行う必要がないため、このはより高速である必要があります。