
Istilah "C ++ modern" sering digunakan sebagai sinonim untuk ekspresi "kode menggunakan standar C ++ baru". Di sini, "baru" dapat berarti apa saja dari C ++ 11 hingga C ++ 17, atau bahkan apa yang sudah tersedia dari C ++ 20. Saya pikir C ++ modern adalah sesuatu yang lebih, tidak terbatas pada menambahkan
-std = c ++ 17 flag.
Apa artinya modern?
Jika kita mencari arti kata "modern" di internet, salah satu yang pertama kita akan menemukan definisi dari
kamus Merriam-Webster . Berikut adalah dua bagian yang terkait dengan C ++:
[...]2: melibatkan teknik, metode, atau gagasan terkini: metode komunikasi modern (terkini)3 dikapitalisasi: dari, berkaitan dengan, atau memiliki karakteristik perkembangan bahasa saat ini atau yang terbaru - Bahasa Inggris Modern[...]Teknik, metode, dan gagasan berhubungan dengan lebih dari sekadar fitur baru bahasa tersebut. Seringkali fitur baru ini mendukung atau memasukkan teknik baru, tetapi banyak dari mereka telah ada selama beberapa waktu. Adapun karakteristik pengembangan bahasa, mereka didasarkan pada bagaimana kita menggunakan bahasa. Ini merujuk pada bagaimana kami menggabungkan fitur lama dan baru, dan ini lebih dari sekedar program C ++ yang berfungsi, atau sesuatu yang termasuk dalam pustaka standar.
Orang bisa berpendapat bahwa kemampuan yang sudah ada sejak C ++ 98 bukan bagian dari C ++ modern, karena mereka sudah ada terlalu lama. Namun, harus diingat bahwa orang yang paling aktif dalam komunitas yang berbicara atau menulis tentang "C ++ modern" paling sering adalah perintis. Sebagian besar menggunakan, mempelajari, dan bahkan mengajarkan "C dengan kelas" lama yang baik dari tahun 90-an, yang membuat banyak metode yang tidak digunakan di sana menjadi bagian dari C ++ modern.
Di Luar Fitur Baru
Manakah dari yang tersedia di C ++ 98 yang saya anggap termasuk dalam kategori “modern C ++”? Berikut ini sebagian daftar fitur dan ide penting:
RAII
RAII singkatan dari "mendapatkan sumber daya adalah inisialisasi", atau "mendapatkan tanggung jawab adalah inisialisasi". Meskipun namanya berfokus pada "inisialisasi," bagian kunci di sini sebenarnya adalah destruktor. Pelepasan sumber daya deterministik adalah salah satu karakteristik utama C ++ yang membedakannya dari sebagian besar bahasa lain. Bagi banyak orang, ini adalah karakteristik yang
paling penting .
RAII dapat digunakan untuk mengelola banyak hal dengan andal, seperti memori (misalnya,
std :: vector, std :: string ), deskriptor file (
std :: fstream ), koneksi jaringan, mutex, koneksi basis data, serta entitas yang jauh terkait dengan sumber daya. Jika Anda memerlukan cara yang dapat diandalkan untuk melakukan beberapa tindakan, dan kemudian membatalkannya saat Anda keluar dari cakupan tertentu atau ketika menghancurkan objek, RAII adalah yang Anda butuhkan.
Saya melihat banyak kode di mana pembersihan manual di akhir fungsi berubah menjadi mimpi buruk. Dalam kasus pengecualian, pembersihan seperti itu tidak terjadi, jadi dalam situasi ini,
RAII adalah yang Anda butuhkan . Bahkan jika Anda tidak menggunakan pengecualian,
keluar awal dari fungsi dapat secara signifikan meningkatkan kode Anda, tetapi hanya jika Anda tidak perlu membersihkannya.
Teknik RAII jelas merupakan bagian dari C ++ modern, meskipun sudah tersedia sejak awal.
Mengetik dengan kuat
Gagasan
mengetik kuat telah sangat populer akhir-akhir ini. Di masa lalu, pengidentifikasi, ukuran, kode pos, harga, dan sebagainya, diwakili melalui int atau dobel, atau jenis aritmatika lainnya. Fakta bahwa mereka kompatibel, sama sekali tidak terkait dengan makna satu sama lain, yang kebetulan murni dari jenis yang sama, adalah sumber bug, tetapi apa yang harus dilakukan? Setidaknya kompiler tidak secara diam-diam
mengubah angka dan array ke string !
Bahkan, ternyata sistem tipe C ++ dan abstraksi nol biaya * yang disediakan oleh kompiler dapat kita lakukan banyak. Cukup buat jenis yang berbeda untuk pengidentifikasi, kode pos, ukuran (tidak, tidak ada typedef, terima kasih) dan seterusnya. Jika Anda tertarik, periksa salah satu kuliah oleh
Björn Fahller ,
Jonathan Boccara, atau
Jonathan Müller .
* (Bahkan jika biaya abstraksi adalah nol,
buktikan bahwa itu tidak dapat diterima sebelum meninggalkannya)
Terlepas dari beberapa tambahan terbaru, <algorithm> telah ada di pustaka standar sejak awal. Tetapi jika Anda melihat kode, ternyata orang sering lebih suka menulis loop secara manual. Alasannya berkisar dari tidak tahu apa algoritma standar yang tersedia untuk percaya bahwa "pola terlalu lambat" (sering tanpa penjelasan, dibandingkan dengan apa).
Memprogram fase kompilasi
Hal-hal seperti metaprogramming menggunakan templat telah digunakan sejak C ++ 98. Logika yang dieksekusi pada waktu kompilasi dapat secara signifikan mengurangi kompleksitas pada saat run time. Di masa lalu, itu tidak nyaman untuk digunakan. Sintaks templat berbeda dalam arah kompleksitas dari kemampuan yang ada dalam standar terbaru. Ini adalah sesuatu seperti bahasa terpisah yang harus kita pelajari. Namun, hal-hal seperti pengiriman tag atau sifat tidak terlalu rumit untuk digunakan dan ditulis.
Ya, sebagian besar ciri di pustaka standar muncul dengan munculnya C ++ 11, tetapi menuliskannya sesuai kebutuhan Anda
tidak terlalu sulit, dan beberapa yang paling umum ada di Boost sebelum C ++ 11. Saya menganggap penggunaan tahap logika kompilasi menjadi bagian dari C ++ modern karena memisahkan C ++ dari mana-mana "C dengan kelas".
Kesimpulan
C ++ modern tidak terkait dengan standar baru, tetapi dengan cara kami menulis program kami. Pertama, C ++ 98 dapat ditulis dalam gaya yang kurang lebih modern. Kedua, "C dengan kelas dan jangkauan untuk loop" belum merupakan C ++ modern. Fitur-fitur baru dari bahasa dan pustaka membantu kami menulis dalam gaya C ++ modern, tetapi mereka tidak membuat kode kami menjadi C ++ modern.