ProgramlamaC++ Backend geliştirici

C++'ta parametre geçiş yöntemlerinin (by value, by pointer, by reference) mirası nasıl çalışır ve her bir yönteminin tuzakları nelerdir?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap.

C++'ta işlevin parametreleri (metodların üyeleri de dahil) şu şekillerde geçilebilir:

  • Değer ile (by value): İşlev içinde nesnenin bir kopyası oluşturulur. Orijinal değişmez, ancak dinamik kaynaklar varsa — yanlış kopyalama olabilir!
  • Göstergesi ile (by pointer): Adresi geçiyoruz. Orijinali değiştirebiliriz, nullptr'lar olabilir, bellek kontrolü ve sahipliği eksikliği nedeniyle tehlike vardır.
  • Referans ile (by reference): Göstergedeki gibi, ancak sözdizimi normal bir değişken gibidir. Referansın geçerli olması zorunludur, yönlendirme yapılamaz, ancak const ile kopyalama yükünü azaltır.

Ö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.

Kandırmaca Sorusu.

const MyClass& obj ile MyClass obj iş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

Konunun inceliklerini bilmemekten kaynaklanan gerçek hata örnekleri.


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ı.