Konu hakkında: "Sözdizimsel şeker" terimini Peter Landin 1960'lı yıllarda önerdi. C++'da başlangıçtan itibaren, daha detaylı temel sözdizimle ifade edilebilecek yeni yetenekler eklemeden, kod yazımını ve algısını kolaylaştıran üst yapı yapıları bulunmaktadır.
Sorun: Sözdizimsel şekerin temel amacı, kodu daha kısa, anlamlı ve okunabilir hale getirmek, hata olasılığını azaltmak ve geliştirmeyi hızlandırmaktır. Öte yandan, aşırı karmaşık sözdizimi, kafa karışıklığına ve kodun performansı veya anlaşılmasında gizli sorunlara yol açabilir.
Çözüm: C++'da sözdizimsel şeker olarak nitelendirilen birçok yapı, aslında dilin daha temel elemanlarının üst yapılarıdır. Örnekler: operatör aşırı yüklemeleri, range-based for, başlatma listeleri, auto, lambda ifadeleri.
Kod örneği:
std::vector<int> v = {1, 2, 3, 4}; for (auto x : v) { std::cout << x << std::endl; } // Aynı (şekersiz): for (std::vector<int>::iterator it = v.begin(); it != v.end(); ++it) { std::cout << *it << std::endl; }
Ana özellikler:
Auto, derleme aşamasında tip belirlemesini mi değiştirdi, ve kullanımında herhangi bir ek yük (overhead) var mı?
Hayır, auto tamamen derleme aşamasında belirlenir, eğer doğru kullanılırsa hız kaybı olmadan. Hatalar yalnızca dikkatsizlik sonucu auto'nun beklediğimiz tipte olmaması durumunda ortaya çıkar.
For (auto x : v) her zaman kapsayıcıyı dolaşmanın en hızlı yolu mudur?
Hayır. Bu sözdizimi, elemanları kopyalayabilir (eğer & belirtilmemişse), bu da büyük nesnelerde performans kaybına neden olabilir. Bunu önlemek için referans kullanılması önerilir:
for (auto& x : v) { ... }
Operatör aşırı yüklemesi her zaman kodu daha anlaşılır hale getirir mi?
Hayır! Operatör aşırı yüklemesi, eğer operatörler anlamsız bir şekilde aşırı yüklenmişse zararlı olabilir (örneğin, operator+ operatörünü elemanları silmek için aşırı yüklemek), bu durumda kod daha karmaşık hale gelir.
İteratör fonksiyonunun döndürdüğü türü dikkate almadan auto kullanımı:
std::vector<std::pair<int, int>> data; for (auto x : data) { x.first = 0; } // Değişiklik olmayacak, çünkü kopya
Artılar:
Eksiler:
for (auto& x : data) { x.first = 0; } // Artık değişiklik etkili
Artılar:
Eksiler: