2013-02-04 15 views
5

sonra ilk seçenek iyidir ya da her ikisi aynı- (Sadece dize arasında yineleme istiyorum, ama dize boyutu büyük olduğu için ben yerel bir kopyasını istemiyorum yapılacak olan .)string parametresi olarak mı? ben bir dize değiştirmek için gitmiyorum Eğer

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


int getString (string str1) { 
    //code 
} 

Ve dize değiştirme planı yaparsanız, o zaman ikisi arasında bir fark var mı? C++ 'da dizeler değişmez olduğundan mı?

+2

Dizeler C++ 'da değişmez değildir. Değiştirmeniz gerekmiyorsa, yalnızca const referansına geçin. – chris

cevap

7

dize hazır iletmenin, std::string s değildir.

ilk geçiş referans ile olan. Dizeyi değiştirmeyi planlamıyorsanız, const referansı ile iletin.

ikinci pass-by-değeri - eğer işlevi içinde dizeyi değiştirmek yaparsanız, sadece bir kopyasını değiştirerek olurdu, bu nedenle tartışmalı bulunuyor.

+0

Yani referans ile geçmek ve dize değiştirmek, orijinal dizgisi değişecek? java'nın aksine bir kopya değil mi? – ofey

+0

@ofey - evet, ama Java'yı en son kullandığım zaman, sınıf tiplerinin (yani temel olmayan) türlerin de referans değil, değer olarak geçtiğinden eminim. Java'da 'string' ile' String' arasında bir fark olabilir. i büyük bir dize değiştirmek istiyorum ve ben orijinal değeri kaydedilirken umurumda değil eğer – slugonamission

+0

@slugonamission yüzden, ben referans olarak geçmek gerekir ve hiçbir yerel kopya yapılacaktır? – ofey

9

Neden const referans olarak geçemiyor? Bu şekilde, ne bir kopyanın ne yapılacağı, ne de çağrılan fonksiyonun stringi değiştiremeyeceği de söylenemez.

int getString(string const &str1) 
{ 
} 
2

Evet, arada fark var olacaktır.

(& olmadan), ikinci varyant getString fonksiyon kapsamı içine değeri dize kopyalar. Bu, yaptığınız tüm güncellemelerin, arayanın kopyasını değil yerel kopyayı etkileyeceği anlamına gelir. Bu, sınıfın kopya kurucusunu eski değere (std::string(std::string& val)) çağırarak yapılır.

Diğer taraftan, ilk varyant (& ile) başvuruyla geçer, bu nedenle başvuru değişkeni olarak işaretlenmedikçe yerel değişkenin değiştirilmesi arayanın değişkenini değiştirir (bu durumda değeri değiştiremezsiniz) . Bu ,'un daha hızlı olmasını sağlamalıdır, çünkü dizeyi değiştirmiyorsanız, kopyalama işlemi gerekmez.