Menu

Kata Kunci auto C++: Penjelasan Deduksi Tipe dengan Contoh

Cara kata kunci auto membiarkan compiler menyimpulkan tipe variabel untukmu: apa yang ia buang, di mana ia unggul, dan jebakan yang sering menjebak pemula.

Halaman ini dilengkapi editor yang bisa dijalankan. Edit, jalankan, dan lihat output-nya seketika.

Biarkan Compiler Memilih Tipenya

Di halaman sebelumnya kamu melihat bahwa setiap variabel C++ punya tipe yang tetap: int, double, std::string, dan seterusnya. Menulis tipe itu secara manual tidak masalah untuk int count = 0;, tetapi jadi ramai begitu nama tipenya panjang. Kata kunci auto (C++11 ke atas) membiarkan compiler menyimpulkan tipe dari nilai yang kamu berikan, jadi kamu cukup menulis nilainya sekali dan compiler melengkapi sisanya.

Ide kuncinya: auto bukan dynamic typing. Setiap variabel tetap punya satu tipe konkret yang dikunci saat kompilasi. auto hanya menghemat kamu dari menuliskannya.

Kenapa auto Layak Dipakai

Untuk tipe yang pendek dan jelas, auto count = 0; dan int count = 0; sama mudahnya dibaca. auto benar-benar terasa manfaatnya untuk nama tipe yang panjang dan berulang, seperti yang kamu dapat dari container dan iterator standard library.

Bandingkan versi panjang dengan versi auto:

// Without auto - the type is written twice, in effect
std::vector<std::pair<std::string, int>>::iterator it = scores.begin();

// With auto - the compiler already knows the type
auto it = scores.begin();

Keduanya mendeklarasikan tipe iterator yang persis sama. Yang kedua lebih mudah dibaca dan tidak akan jadi tidak cocok kalau nanti kamu mengganti scores dengan container lain.

Berikut contohnya dalam program lengkap:

auto di Range-Based for Loop

Tempat paling umum kamu bertemu auto adalah range-based for loop. Kamu hampir tidak pernah ingin menulis tipe elemennya secara manual, dan cara kamu menulis auto menentukan apakah kamu mendapat salinan atau referensi.

Ada tiga variasi yang akan kamu lihat, dan artinya masing-masing:

  • for (auto x : v): x adalah salinan dari setiap elemen. Murah untuk int, boros untuk objek besar.
  • for (auto& x : v): x adalah referensi; kamu bisa mengubah elemennya langsung di tempat.
  • for (const auto& x : v): x adalah referensi read-only. Pakai ini kalau kamu hanya perlu membaca.

Program berikut mengubah isi container lewat auto&:

Jebakannya: tulis for (auto n : nums) (tanpa &) di loop itu, dan n *= 10 diam-diam hanya mengubah salinannya, sementara nums tetap utuh. Compiler tidak akan memperingatkanmu; loop-nya hanya tidak melakukan apa pun yang berguna.

Apa yang Dibuang oleh auto

auto biasa menyimpulkan tipe dengan cara yang sama seperti parameter fungsi by value: ia membuang const tingkat atas, referensi, dan volatile. Artinya auto selalu memberimu salinan baru yang bisa diubah, kecuali kamu meminta yang lain.

Kalau kamu ingin mempertahankan const atau menghindari salinan, tambahkan sendiri qualifier-nya. Polanya adalah menghias auto dengan cara yang sama seperti kamu menghias tipe apa pun:

Jadi auto menyimpulkan tipe dasar-nya; &, const, dan * adalah tambahan yang kamu pasang di atasnya. auto adalah tipenya, const auto& adalah referensi read-only ke tipe itu.

Kesalahan Umum dan Jebakan

auto menghilangkan usaha mengetik, bukan kebutuhan untuk memahami tipe. Beberapa jebakan sering menangkap pemula:

Kamu wajib menginisialisasi. auto tidak punya apa pun untuk disimpulkan dari deklarasi kosong, jadi ini compile error:

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

Literal bilangan bulat bertipe int, bukan double. auto half = 1 / 2; menyimpulkan int dan menyimpan 0, karena 1 / 2 adalah pembagian bilangan bulat sebelum auto sempat melihatnya. Tipenya mengikuti nilainya:

auto membuang referensi, jadi waspadai kejutan salinan. Kalau sebuah fungsi mengembalikan referensi dan kamu menangkapnya dengan auto biasa, kamu mendapat salinan, yang kadang menjadi bug performa nyata di loop yang sering dijalankan (deep copy objek besar di setiap iterasi). Pakai const auto& kalau maksudmu "lihat saja, jangan ambil."

Jangan sembunyikan tipe saat tipe itu penting. auto result = compute(); tidak masalah kalau tipe kembalian compute jelas dari konteksnya, tetapi kalau pembaca harus mencari-cari apa sebenarnya result, menuliskan tipenya bisa jadi pilihan yang lebih ramah. auto gunanya untuk mengurangi keramaian, bukan untuk menyembunyikan maksud.

Berikutnya: Konstanta dan const

Sekarang kamu tahu bahwa auto sengaja membuang const kecuali kamu memintanya dipertahankan. Ini memunculkan pertanyaan yang jelas: apa sebenarnya yang dijamin oleh const, dan kapan kamu sebaiknya menandai sebuah nilai sebagai tidak bisa diubah? Halaman berikutnya membahas const, ekspresi konstan, dan kenapa "jadikan const secara default" adalah salah satu kebiasaan paling berguna di C++.

Pertanyaan yang sering diajukan

Apa fungsi kata kunci auto di C++?

auto menyuruh compiler menyimpulkan tipe variabel dari nilai awalnya. auto x = 5; membuat x menjadi int; auto y = 3.14; membuat y menjadi double. Tipenya ditetapkan saat kompilasi. auto bukan dynamic typing, melainkan jalan pintas agar kamu tidak perlu menulis tipenya sendiri.

Apakah auto mempertahankan const dan referensi di C++?

Tidak. auto biasa membuang const tingkat atas, referensi, dan volatile. Kalau sumbernya const int& r, maka auto x = r; menghasilkan salinan int biasa. Untuk mempertahankannya, tulis secara eksplisit: pakai const auto& untuk mengikat referensi read-only tanpa menyalin.

Bisakah mendeklarasikan variabel dengan auto tanpa menginisialisasinya?

Tidak. auto x; adalah compile error karena tidak ada nilai awal yang bisa dipakai compiler untuk menyimpulkan tipenya. Setiap variabel auto harus diberi nilai saat dideklarasikan.

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai