ProgramlamaC++ geliştirici

const-correctness C++'ta nasıl çalışır? const niteliklerini kullanmanın önemi nedir ve const-correctness hangi hataların önüne geçer? const'un metodlar ve fonksiyonlardaki gerçek kullanımına örnek verin.

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

Cevap.

const-correctness — C++'ta değişkenlerin, işaretçilerin, referansların ve metodların "sadece okunabilir" olarak işaretlenmesini tanımlayan bir kavramdır. Bu, kodun güvenliğini artırır, sınıf arayüzlerini daha anlaşılır hale getirir ve derleyicinin hataları derleme aşamasında yakalamasını sağlar, çalışma zamanında değil.

const niteliklerinin kullanımı önemlidir çünkü:

  • Hangi metodların ve fonksiyonların nesneyi/verileri değiştirmediğini açıkça ayırmaya olanak tanır.
  • Değiştirilmemesi gereken verilerin kazara değiştirilmesini önler.
  • Derleyicinin kodu optimize etmesine yardımcı olur.

Örnek:

class MyArray { public: int getItem(size_t idx) const { // Nesneyi değiştirmez return arr[idx]; } void setItem(size_t idx, int value) { arr[idx] = value; } private: int arr[10]; };

Burada getItem metodu nesneyi değiştirmediğini garanti eder.

Kandırmacalı soru.

Aşağıdakilerin farkı nedir?

void foo(const int* ptr);

ile

void foo(int* const ptr);

?

Doğru yanıt:

  • const int* ptr — sabit bir değere işaret eden işaretçi, değeri değiştirmek yok, işaretçiyi değiştirebilirsiniz.
  • int* const ptr — değiştirilebilir bir değere sabit işaretçi, işaretçiyi değiştiremezsiniz, değeri değiştirebilirsiniz.

Gerçek hatalara ilişkin örnekler.


Hikaye
Büyük bir projede bir sınıf metodunu const niteliksiz olarak yazılmıştır:

int MyClass::getVal();

Bu nedenle sınıf nesnesini const referans olarak kullanmak mümkün olmamıştır, örneğin, sadece "sadece okuma" nesneleri ile çalışan fonksiyonlarda. Bu, kodun yeniden kullanımını sınırlamış ve nesnelerin gereksiz yere kopyalanmasına neden olmuştur.


Hikaye
Geliştirici, yanlışlıkla iç veriye yönelik bir referans döndürdü:

int& MyClass::getInt();

Sonuç olarak, istemci kodu sınıfın özel alanını değiştirme olanağına sahip oldu ki bu da beklenmedik durum değişikliklerine ve zor tespit edilen hatalara yol açtı.


Hikaye
Bir fonksiyonda sabit parametreyi const olmadan bırakma:

void printVector(std::vector<int>& v);

Birisi, hata ayıklama için işlev içinde vektörü yanlışlıkla değiştirdi, bu kodu kaldırmayı unutarak. Bu, testlerde neredeyse fark edilmeyen bir yan etki yarattı ve yalnızca üretimde ortaya çıktı.