ProgramlamaBackend C++ geliştirici

C++'de 'auto' anahtar kelimesini tanımlayın. Tip çıkarmada nasıl çalışır ve hangi durumlarda hatalara yol açabilir? Auto kullanımı ne zaman potansiyel olarak tehlikelidir?

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

Cevap

C++'de auto anahtar kelimesi (C++11'den itibaren), derleyicinin değişken tipini başlatıcı ifadeden otomatik olarak çıkarmasına olanak tanır. Bu, uzun tiplerle (örneğin, iteratörlerle, lambda ifadeleriyle, şablon ifadeleriyle çalışırken) çalışmayı kolaylaştırır ve kodun okunabilirliğini artırır.

Kullanım örneği:

auto i = 42; // int auto d = 3.14; // double auto s = std::string("hi"); auto it = v.begin(); // iteratör

Ancak, auto tam olarak kendisine "sunulan" şeye göre tip çıkarır. Örneğin, eğer değer olarak dönerse, auto değer çıkarır; eğer referans olarak dönerse, referans çıkarır. Referanslarla, işaretçilerle, const nitelikleriyle çalışırken dikkatli olunmalıdır.

Önemli örnek:

std::vector<int> v = {1,2,3}; for (auto x : v) x = 0; // kopyalama, v değişmeyecek for (auto& x : v) x = 0; // referans, elemanlar sıfırlanacak

Altta yatan bir soru

const auto z = foo(); ifadesindeki değişken 'z' 'foo()' metodunun int referansı (int&) döndürmesi durumunda ne tür bir tipe sahip olacaktır?

Cevap:

const auto z tipi int (değer) olarak çıkar, eğer referans döndürüyorsa. Referansı çıkarmak için auto& z kullanmak gerekir. const nitelikleri, tür çıkarımından sonra auto-tipe uygulanır.

Örnek:

int x = 5; auto a = x; // a — int auto& b = x; // b — int& const auto c = x; // c — const int auto d = foo(); // d — int (eğer foo int döndürüyorsa) auto& e = foo(); // e — int&

Konuyla ilgili yanlış anlamalardan kaynaklanan gerçek hata örnekleri.


Hikaye

Büyük bir web hizmetinde, akıllı işaretçi koleksiyonu üzerinde auto yerine range-based for c auto kullanıldı. Bu, nesnelerin kopyalanmasına neden oldu ve milyonlarca kayıt ile işlem yaparken programı 16 kat yavaşlattı.


Hikaye

Grafikle çalışma kütüphanesinde, döndürülen iteratöre auto uygulandı, bunun bir referans olmasını bekleyerek, ancak geçici bir nesne elde edildi. İteratör, döngüden önce yok oldu, program UB'ye düştü.


Hikaye

Finansal sistemde, map'ten değer elde etmek için auto kullanımı sırasında anahtarın constness'ını unuttular, bu da verileri değiştirirken bir yapılamayan referans yoluyla veri değişikliği yapmaya çalışmayı ve sonrasında derleme hataları ve çalışma zamanı çökmelerine neden oldu.