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