2013-02-04 8 views
5

文字列を変更しない場合は、最初のオプションがより良いか同じである -(文字列を繰り返し処理したいが、文字列サイズが大きいのでローカルコピーを作成したくない。)パラメータとしての文字列?

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


int getString (string str1) { 
    //code 
} 

そして、私は、文字列を変更することを計画しない場合、2つの間に違いはありますか?それは文字列がC++では不変であるからですか?

+2

文字列はC++では不変ではありません。変更する必要がない場合は、const参照を渡してください。 – chris

答えて

7

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

最初のものは参照渡しです。文字列の変更を計画していない場合は、constの参照で渡してください。

2番目の値は値渡しです。関数内の文字列を変更すると、コピーを変更するだけなので、それは問題です。

+0

私は参照渡しと文字列を変更する場合、元の文字列が変更されますか? javaとは違ってコピーではないのですか? – ofey

+0

@ofey - はい、以前はJavaを使っていましたが、クラス型(つまり非基本型)も値ではなく参照渡しされていることは間違いありません。 Javaの 'string'と' String'の違いかもしれません。 – slugonamission

+0

@slugonamission もし私が巨大な文字列を変更したいのであれば、元の値を保存するのを気にしません。 – ofey

9

const参照を渡すのはなぜですか?この方法では、コピーを作成することも、呼び出される関数は文字列を変更することもできません。

int getString(string const &str1) 
{ 
} 
2

はい、違いがあります。

&せず)は、第2の変形例は、getString関数の範囲内の値で文字列をコピーします。つまり、更新が行われると、ローカルコピーに影響し、呼び出し元のコピーには影響しません。これは、古い値(std::string(std::string& val))を持つクラスのコピーコンストラクタを呼び出すことによって行われます。

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

関連する問題