C++'ta işlevin parametreleri (metodların üyeleri de dahil) şu şekillerde geçilebilir:
Örnek:
void foo(int value); // değer ile void foo(int* ptr); // gösterge ile void foo(const int& ref); // referans ile (büyük nesneler için optimal!)
Referans ile geçişte kopyalama önleme optimizasyonu (copy elision) uygulanabilir ve büyük nesneler için const & önerilir. Göstergelerde her zaman nullptr kontrolü yapın.
const MyClass& objileMyClass objişlev parametrelerinde ne fark var?
Cevap:
const MyClass& nesneyi kopyalamaz, yalnızca değiştirilemeyecek şekilde erişim sağlar (büyük nesneler için optimal). MyClass obj her zaman bir kopya oluşturur, bu da büyük boyutlarda veya doğru kopyalamanın (örneğin, deep copy uygulanmamışsa) yokluğunda maliyetlidir.
void process(const std::string& s); // Kopyalanmaz void process(std::string s); // Kopyalar
Hikaye Kurumsal matematiksel yapı kütüphanesinde programcı, büyük konteynerleri değer ile geçirerek işlemi hızlandırmaya karar verdi. Bu, her işlev çağrısında önemli maliyetler oluşturdu — performans iki katına düştü.
Hikaye Kullanıcı yönetimi modülünde nullptr kontrolü olmadan göstergeler kullanıldı. Geçersiz göstergelere başvururken bazen rastgele çökme meydana geliyordu, hata ayıklama aylar sürdü.
Hikaye Görüntü işleme projesinde bazı işlevler nesneleri değer ile alıyor, diğerleri referans ile. Bir sınıf için deep copy uygulanmamıştı, bu da bellek sızıntılarına ve değer ile geçiş sonrası kaynakların örtülü ortak sahipliğine yol açtı.