Menu

C++ auto Anahtar Sözcüğü: Örneklerle Tür Çıkarımı

auto anahtar sözcüğünün derleyicinin bir değişkenin türünü senin yerine çıkarmasına nasıl izin verdiği - neyi attığı, nerede parladığı ve yeni başlayanları ısıran tuzaklar.

Bu sayfada çalıştırılabilir editörler var - düzenle, çalıştır ve sonucu anında gör.

Türü Derleyici Seçsin

Önceki sayfada her C++ değişkeninin sabit bir türü olduğunu gördün - int, double, std::string vb. Bu türü elle yazmak int count = 0; için sorun değil, ama türler uzadıkça gürültülü hale gelir. auto anahtar sözcüğü (C++11 ve sonrası) derleyicinin türü atadığın değerden çıkarmasına izin verir, böylece değeri bir kez yazarsın ve gerisini derleyici doldurur.

Temel fikir: auto dinamik tür değildir. Her değişkenin hâlâ derleme zamanında kilitlenmiş tek bir somut türü vardır. auto sadece bunu yazmaktan seni kurtarır.

auto Neden Hakkını Verir

Kısa, bariz türler için auto count = 0; ve int count = 0; eşit derecede okunabilirdir. auto'nun gerçekten kazandırdığı yer uzun, tekrar eden tür adlarıdır - standart kütüphanenin kapsayıcılarından ve yineleyicilerinden gelen türden.

Ayrıntılı sürümü auto sürümüyle karşılaştır:

// auto olmadan - tür etkin biçimde iki kez yazılır
std::vector<std::pair<std::string, int>>::iterator it = scores.begin();

// auto ile - derleyici türü zaten biliyor
auto it = scores.begin();

Her ikisi de tam olarak aynı yineleyici türünü tanımlar. İkincisi okunması daha kolaydır ve daha sonra scores'u farklı bir kapsayıcıya değiştirirsen senkronizasyondan çıkmaz.

İşte tam bir programın içinde:

Aralık Tabanlı for Döngülerinde auto

auto ile karşılaşacağın en yaygın yer aralık tabanlı for döngüsüdür. Eleman türünü elle yazmak neredeyse hiç istemezsin ve auto'yu nasıl yazdığın, bir kopya mı yoksa bir referans mı alacağına karar verir.

Göreceğin üç çeşit ve her birinin anlamı:

  • for (auto x : v) - x, her elemanın bir kopyasıdır. int için ucuz, büyük nesneler için savurgan.
  • for (auto& x : v) - x bir referanstır; elemanları yerinde değiştirebilirsin.
  • for (const auto& x : v) - x salt okunur bir referanstır. Yalnızca okuman gerektiğinde bunu kullan.

Bir sonraki program kapsayıcıyı auto& aracılığıyla değiştirir:

Tuzak: o döngüde for (auto n : nums) (& olmadan) yazarsan, n *= 10 sessizce yalnızca kopyayı değiştirir ve nums'a dokunmaz. Derleyici seni uyarmaz - döngü işe yarar hiçbir şey yapmaz.

auto Neyi Atar

Sade bir auto, türü tıpkı değere göre alınan bir işlev parametresinin yaptığı gibi çıkarır: üst düzey const, referansları ve volatile'i atar. Bu, aksini istemediğin sürece auto'nun sana her zaman taze, değiştirilebilir bir kopya vermesi demektir.

const'i korumak veya kopyadan kaçınmak istiyorsan, niteleyicileri kendin eklersin. Kalıp, auto'yu herhangi bir türü süsleyeceğin gibi süslemektir:

Yani auto, temel türü çıkarır; &, const ve * üstüne eklediğin düğmelerdir. auto türdür, const auto& ise ona salt okunur bir referanstır.

Yaygın Hatalar ve Tuzaklar

auto yazma çabasını ortadan kaldırır, türleri anlama ihtiyacını değil. Yeni başlayanları yakalayan birkaç tuzak var:

Başlatmak zorundasın. auto'nun boş bir bildirimden çıkaracak hiçbir şeyi yoktur, bu yüzden bu kesin bir derleme hatasıdır:

auto x;        // error: declaration of 'auto x' has no initializer
auto y = 0;    // sorun yok

Tamsayı değişmezleri int'tir, double değil. auto half = 1 / 2; int çıkarır ve 0 saklar, çünkü 1 / 2, auto onu görmeden önce tamsayı bölmesidir. Tür değeri izler:

auto referansı atar - sarkan kopya sürprizlerine dikkat et. Bir işlev bir referans döndürüyorsa ve onu sade auto ile yakalarsan, bir kopya alırsın, ki bu sıcak bir döngüde bazen gerçek bir performans hatasıdır (her yinelemede büyük bir nesnenin derin kopyası). "Bak, ama alma" demek istediğinde const auto&'a uzan.

Önemli olduğunda türü gizleme. auto result = compute();, compute'un dönüş türü bağlamdan bariz olduğunda sorun değil, ama bir okuyucunun result'ın gerçekte ne olduğunu avlaması gerekiyorsa, türü açıkça yazmak daha dostça bir tercih olabilir. auto gürültüyü kesmek içindir, niyeti gizlemek için değil.

Sıradaki: Sabitler ve const

Artık auto'nun, korumasını istemediğin sürece const'i kasıtlı olarak attığını gördün - ki bu bariz soruyu doğurur: const gerçekte neyi garanti eder ve bir değeri en başında ne zaman değiştirilemez olarak işaretlemelisin? Sonraki sayfa const'i, sabit ifadeleri ve "varsayılan olarak const yap"ın neden C++'taki en faydalı alışkanlıklardan biri olduğunu derinlemesine ele alıyor.

Sıkça Sorulan Sorular

C++ içinde auto anahtar sözcüğü ne yapar?

auto, derleyiciye değişkenin türünü başlatıcısından çıkarmasını söyler. auto x = 5; ifadesi x'i bir int yapar; auto y = 3.14; ifadesi y'yi bir double yapar. Tür derleme zamanında sabitlenir - auto dinamik tür değildir, türü kendin yazmak yerine bir kısa yoldur.

auto, C++ içinde const ve referansları korur mu?

Hayır. Sade bir auto, üst düzey const, referanslar ve volatile'i atar. Kaynak const int& r ise, auto x = r; sade bir int kopyası verir. Bunları korumak için açıkça belirtirsin: kopyalamadan salt okunur bir referans bağlamak için const auto& kullan.

Bir değişkeni auto ile başlatmadan tanımlayabilir misin?

Hayır. auto x; bir derleme hatasıdır çünkü derleyicinin tür çıkaracağı bir başlatıcı yoktur. Her auto değişkenine tanımlandığı noktada bir değer verilmelidir.

Coddy programming languages illustration

Coddy ile kodlamayı öğren

BAŞLA