Apakah C ++ modern menjadi lebih lazim? [Tutup]


132

Ketika saya pertama kali belajar C ++ 6-7 tahun yang lalu, apa yang saya pelajari pada dasarnya adalah "C with Classes". std::vectorjelas merupakan topik lanjutan, sesuatu yang bisa Anda pelajari jika Anda benar - benar ingin. Dan tentu saja tidak ada yang memberi tahu saya bahwa destruktor dapat dimanfaatkan untuk membantu mengelola memori. Hari ini, di mana-mana saya melihat saya melihat RAII dan SFINAE dan STL dan Boost dan, yah, Modern C ++. Bahkan orang-orang yang baru memulai dengan bahasa tampaknya diajarkan konsep-konsep ini hampir sejak hari pertama.

Pertanyaan saya adalah, apakah ini semata-mata karena saya hanya melihat yang "terbaik", yaitu pertanyaan di SO, dan di situs pemrograman lain yang cenderung menarik pemula (gamedev.net), atau apakah ini sebenarnya mewakili Komunitas C ++ secara keseluruhan?

Apakah C ++ modern benar-benar menjadi default? Alih-alih menjadi sesuatu yang mewah yang ditulis oleh para ahli, apakah ini menjadi "jalan C ++"? Atau apakah saya tidak dapat melihat ribuan orang yang masih belajar "C dengan kelas" dan menulis array dinamis mereka sendiri alih-alih menggunakan std::vector, dan melakukan manajemen memori dengan secara manual memanggil baru / menghapus dari kode tingkat atas mereka?

Seperti yang saya ingin percaya, rasanya luar biasa jika komunitas C ++ secara keseluruhan telah berkembang begitu banyak pada dasarnya beberapa tahun. Apa pengalaman dan kesan Anda?

(Penafian: Seseorang yang tidak terbiasa dengan C ++ mungkin salah mengartikan judul sebagai menanyakan apakah C ++ mendapatkan popularitas dibandingkan bahasa lain. Itu bukan pertanyaan saya. "Modern C ++" adalah nama umum untuk dialek atau gaya pemrograman dalam C ++, dinamai sesuai buku " Desain C ++ Modern: Pemrograman Generik dan Pola Desain Diterapkan ", dan saya hanya tertarik pada ini versus" C ++ lama ". Jadi tidak perlu memberi tahu saya bahwa waktu C ++ sudah lewat, dan kita semua harus menggunakan Python;))


2
Sayangnya saya pikir ini akan membutuhkan waktu sebelum komunitas C ++ secara keseluruhan akan cukup maju untuk mengenali cara menggunakan pustaka standar dan meningkatkan bersama dengan penambahan C ++ 0x mendatang secara efektif apalagi menerapkan kode menggunakan metodologi yang sama. Namun, saya pikir C ++ 0x membawa banyak harapan untuk meningkatkan popularitas C ++. Banyak ketidaknyamanan sintaksis harian telah diperbaiki. Saya selalu menganggap hal-hal ini remeh, tetapi bagi orang luar yang melihat bahasa itu, ini adalah sumber keluhan yang umum.
stinky472

15
Dalam kasus saya, setiap kali saya bertemu dengan seorang profesional yang mengerti teknik C ++ modern seperti RAII dan keamanan pengecualian (tidak harus merujuk pada buku Alexandrescu) atau bahkan konsep paling dasar seperti iterator dan algoritma generik, saya menemukan sepuluh lagi yang tidak mengerti. Setidaknya ketika datang ke para profesional, banyak dari mereka terlalu terjebak dalam tenggat waktu untuk mempelajari apa pun yang diketahui, sehingga bahkan para profesional yang menyatakan diri C ++ sering memiliki banyak hal untuk dipelajari. Saya khawatir saya juga menjadi salah satu dari mereka dengan C ++ 0x: ada banyak yang harus saya pelajari dan sesuaikan untuk itu dan saya punya tenggat waktu untuk dipenuhi.
stinky472

Jawaban:


76

Begini cara saya berpikir segalanya telah berevolusi.

Generasi pertama programmer C ++ adalah programmer C, yang sebenarnya menggunakan C ++ sebagai C dengan kelas. Plus, STL belum ada di tempat, jadi itulah yang dasarnya C ++.

Ketika STL keluar, hal-hal yang maju, tetapi sebagian besar orang menulis buku, menyusun kurikulum, dan kelas pengajaran telah belajar C pertama, kemudian hal-hal C ++ ekstra, sehingga generasi kedua belajar dari perspektif itu. Seperti jawaban lain yang dicatat, jika Anda merasa nyaman menulis secara teratur untuk perulangan, mengganti menggunakan std::for_eachtidak akan banyak membantu Anda kecuali perasaan hangat yang kabur bahwa Anda melakukan sesuatu dengan cara "modern".

Sekarang, kami memiliki instruktur dan penulis buku yang telah menggunakan seluruh C ++, dan mendapatkan instruksi mereka dari perspektif itu, seperti Koenig & Moo's Accelerated C ++ dan buku teks baru Stroustrup. Jadi kita tidak belajar char*maka std::strings.

Ini adalah pelajaran yang menarik tentang berapa lama metode pengganti "warisan" harus diganti, terutama ketika mereka memiliki rekam jejak efektivitas.


13
Iya. Itu sangat cerdas untuk membuat C ++ sangat kompatibel dengan C karena basis diinstal besar dari C coders. Sangat mirip dengan strategi sukses MS untuk selalu menjaga kompatibilitas dengan DOS. (Blog yang sangat baik See Raymond Chen untuk panjang sering menyakitkan mereka pergi ke ...)
j_random_hacker

2
Ups, melanjutkan sedikit singgung di sana ... Dimaksudkan untuk mengatakan bahwa saya pikir Anda benar tentang "kesenjangan generasi" antara mereka yang beralih dari C (tetapi terus berpikir gaya-C) dan mereka yang "merasakan pertama kali" "adalah post-STL C ++.
j_random_hacker

57

Pastinya ya. Bagi saya jika Anda tidak memprogram C ++ dengan gaya "Modern C ++" ini seperti istilah Anda, maka tidak ada gunanya menggunakan C ++! Anda mungkin juga hanya menggunakan C. "Modern C ++" harus menjadi satu-satunya cara C ++ diprogram menurut pendapat saya, dan saya berharap bahwa setiap orang yang menggunakan C ++ dan telah diprogram dalam mode "Modern" ini akan setuju dengan saya. Bahkan, saya selalu sangat terkejut ketika saya mendengar seorang programmer C ++ yang tidak mengetahui hal-hal seperti auto_ptr atau ptr_vector. Sejauh yang saya ketahui, ide-ide itu mendasar dan mendasar bagi C ++, jadi saya tidak bisa membayangkannya dengan cara lain.


4
+1; Saya mengambil gaya "modern c ++" sejak awal karena itu adalah cara alami untuk melakukannya (jika Anda tidak berpikir C dengan kelas).
Adam Hawes

21
"Cukup gunakan C?" C sangat kuat.
Clark Gaebel

4
Robot yakin tidak akan pemrograman dalam C ++, mereka tidak cukup bodoh, dan akan berhenti mencoba untuk mengkompilasinya.
Matt Joiner

6
@ClarkGaebel Nah, jika C kuat, begitu juga C ++ dengan warisannya dari C tanpa masalah :)
legends2k

4
@rxantos, Anda mengatakan bahwa seperti kami tidak memiliki banyak pilihan untuk menilai kinerja, misalnya melihat output perakitan, timer, monitor RAM, dan banyak lagi. C ++ tidak berbeda dengan C dalam hal itu. Jika ragu, profil. Ada lagi yang hanya kabar angin.
underscore_d

25

Pada zaman Windows 3.1, C adalah standar. Ketika C ++ menekan pasar pengembang dan kemudian menjadi standar ANSI, itu adalah kehangatan baru. Ini mempopulerkan akronim OOP dan beberapa pola desain dasar menggunakan polimorfisme.

Sekarang, dengan penerimaan yang lebih besar dari platform terkelola penghalang-ke-entri yang rendah, seperti C # /. NET, ada sedikit alasan untuk menggunakan C ++. Begitu banyak basis pengembang akan memiliki pilihan dan mari kita jujur: C ++ adalah beruang untuk belajar bagi seorang pemula. Dengan C #, Anda bisa menjalankannya.

Yang tersisa hanya platform yang MEMBUTUHKAN C ++ dan penginjil C ++ yang keras untuk terus berlatih seni. Ini adalah komunitas yang membutuhkan dan menginginkan semua lapisan abstraksi yang dianggap "Modern C ++".

Jadi ya, saya percaya "Modern C ++", seperti yang Anda sebutkan, menjadi lebih lazim. Meskipun, itu lazim dengan audiens yang berbeda dari yang digunakan di masa lalu.


Ayo teman-teman, jawaban ini membuat beberapa poin bagus C ++ tidak sempurna, kita semua tahu itu, Bjarne sendiri mengeluh bahwa itu terlalu besar dan terlalu sulit untuk dipelajari. Meskipun saya tidak setuju tentang mengapa Modern C ++ telah muncul secara bertahap - IMHO hanya butuh waktu selama ini untuk bahasa yang begitu besar untuk "bergemuruh ke depan."
j_random_hacker

4
Jadi Anda mengatakan bahwa semakin banyak pengembang rata-rata menuju ke C # dan semacamnya, sementara semakin banyak hard-core yang terjebak lebih banyak dengan C ++? (Bukan berarti tidak ada yang benar-benar pintar C # /. NET orang, tetapi ada banyak yang kurang pintar.) Masuk akal.
David Thornley

3
Saya pikir ini poin yang valid. Tentu saja itu tidak benar untuk semua orang, tetapi sebagian besar, saya setuju, kebanyakan orang yang memiliki pilihan sudah menggunakan C # atau Java atau bahasa lain semacam itu.
jalf

3
Gunakan case: Saya ingin klien windows melakukan CRUD di db saya. Gunakan C # /. NET atau C ++ / MFC? Saya ingin aplikasi web ... Gunakan C # / ASP.NET atau C ++ / ISAPI? Saya ingin klon "Nybbles" sederhana menggunakan DirectX C # /. NET atau C ++ / MFC / WTL? Saya ingin demo yang menang di Assembly09 ... pasti C ++ (vs. C #).
spoulson

8
Saya tidak tahu apakah ini masalah lebih banyak lapisan abstraksi atau lebih banyak kekerasan. Saya menduga hanya jenis abstraksi yang tersedia melalui templat saja tidak tersedia di Java atau C #, jadi orang yang suka atau membutuhkannya tetap menggunakan C ++.
Kragen Javier Sitaker

16

Saya salah satu dari orang-orang ini yang belajar bagaimana bekerja dengan STL dan mendengar banyak tentang RAII dan praktik pemrograman C ++ yang baik mulai hari pertama. Sepertinya beberapa buku yang paling direkomendasikan untuk mempelajari C ++ hari ini (seperti Accelerated C ++ dan seri C ++ Efektif) ) fokus menggunakan alat STL daripada menggulung barang Anda sendiri, dan juga memberikan banyak "aturan" untuk pemrograman yang efektif (atau "modern").

Tetapi berbicara dengan teman-teman saya juga mencatat beberapa perusahaan masih bekerja dengan "C with Classes", bukan "Modern C ++". Mungkin budaya yang diusulkan oleh penulis dan pengguna "Modern C ++" akan menang suatu hari nanti :)


Di tempat saya bekerja, kami masih menggunakan C dengan kelas, mungkin karena ada banyak timer lama yang telah ada di sana untuk sementara waktu. Mereka tampak sangat waspada terhadap STL, apalagi MENINGKATKAN.
aneccodeal

12

Saya pikir Anda baru saja mengalami pengalaman buruk mulai.

Anda harus mendapatkan sendiri buku-buku C ++ Efektif Scott Meyers . Saya mulai menggunakan C ++ dengan marah pada tahun 1999, pimpinan tim saya membuat saya duduk dan membaca C ++ yang Efektif dan C ++ yang Lebih Efektif sebelum saya diizinkan memeriksa kode APA PUN.

Sebagian besar sarannya ada di baris "Jangan gunakan fitur ini , tetapi jika Anda harus, ingatlah ini "

Jika Anda mengikuti sarannya, Anda akan menulis C ++ yang baik atau "Modern".

Dia punya buku tentang STL sekarang juga, tapi itu belum saya baca.


Saya harus menyebutkan bahwa ini hanyalah titik awal saya. Hari ini, saya sangat nyaman dengan STL, boost, RAII dan yang lainnya. Saya hanya bertanya-tanya seberapa umum pengalaman awal saya.
jalf

9

Dalam pekerjaan C ++ saya, saya telah menemukan fitur-fitur modern untuk semakin digunakan, dan lebih banyak orang bertanya kepada saya tentang mereka dalam pemutaran dan wawancara telepon. Sejauh yang saya tahu, mereka menangkap.

Saya belajar C ++ awalnya sebagai sesuatu seperti C dengan Kelas; meskipun bahasanya telah jauh lebih maju dari itu, buku-buku yang saya baca dan orang-orang yang bekerja dengan saya benar-benar terjebak pada "C ++ lama". RAII sesuatu yang dipikirkan orang, dan bukannya secara otomatis, dan saya ingat membaca beberapa artikel awal tentang masalah keamanan pengecualian.

Seperti yang ditunjukkan, ada buku baru sekarang. Banyak yang lama masih relevan, tetapi mereka semakin penuh dengan penjelasan mengapa ide-ide buruk jelas buruk. (Demikian pula, sulit bagi pembaca modern untuk memahami bagaimana ide-ide revolusioner Freud tentang pikiran bawah sadar, karena sekarang kebijaksanaan konvensional.)

Stroustrup baru saja keluar dengan buku teks, Pemrograman: Prinsip dan Praktek Menggunakan C ++ . Saya membelinya karena saya belum gagal belajar hal-hal baik dari buku Stroustrup's, tetapi belum melewati beberapa bab pertama. Sejauh ini, yang bisa saya katakan adalah bahwa saya menyetujui cara dia memulai, dan itu setidaknya pengantar yang baik tentang bagaimana C ++ harus digunakan.


Bahkan versi pertama STL bukan pengecualian aman.
Kragen Javier Sitaker

2
Pada saat itu, tidak ada yang benar-benar tahu cara menulis kode pengecualian-aman. Itu berhasil di tahun-tahun setelah penerbitan standar. Saya ingat beberapa artikel di C ++ Report.
David Thornley

7

Saat mengerjakan proyek yang saat ini saya terlibat, ada banyak kode C ++ yang telah berkembang selama periode waktu yang signifikan (lebih dari 10 tahun sekarang). Evolusi yang Anda bicarakan jelas terlihat di sana: kode lama sering "C dengan kelas" - pointer mentah, char*string dan penggunaan fungsi C terkait, array dll; kode yang lebih baru menggunakan ATL smart pointer dan semacamnya untuk mengelola sumber daya, tetapi masih melekat pada loop kode tangan sebagian besar waktu, dan iterator jarang terlihat; dan yang terbaru penuh dengan wadah STL, algoritma,shared_ptr(termasuk penghapusan kustom untuk mengelola pegangan, dll), fungsi yang sangat umum dan template kelas, dan sebagainya. Kebanyakan teknik pengkodean "C dengan kelas" tradisional, seperti pointer mentah yang tidak dienkapsulasi dengan manajemen seumur hidup manual, sangat disukai dalam ulasan kode saat ini. Dilihat dari ini, tampaknya pengamatan Anda akurat.

Perkembangan terbaru tampaknya menjadi tren untuk C ++ 0x lambdas - yang memiliki sisi positif karena ia juga memiringkan keseimbangan dalam mendukung penggunaan algoritma standar melalui loop kode tangan, karena sekarang Anda dapat memiliki semua kode sesuai dengan algoritma juga.


6

Saya tidak akan mengatakan bahwa std :: vector memenuhi syarat sebagai "modern" hari ini. Ini sangat mendasar.

Secara umum kesan saya adalah bahwa orang-orang telah mendapatkan beberapa pengalaman dengan gaya C ++ modern dan sedikit sadar. Hanya untuk mengambil contoh sederhana, STL for_each menarik tetapi dalam praktiknya tidak menambah banyak nilai mengerikan pada loop C biasa. Lebih sulit untuk di-debug dan terkadang tidak memberikan kinerja terbaik. Juga konstruksi untuk pemrograman fungsional dalam STL saat ini umumnya sangat rumit, terutama jika Anda mendapatkan pengalaman dari bahasa fungsional nyata seperti ML.


1
mengapa Anda mengatakan vektor tidak memenuhi syarat sebagai modern? itu masih canggih untuk banyak kasus penggunaan, meskipun dasar. tapi saya pikir sesuatu yang mendasar tidak berarti itu tidak modern sebaliknya, sebaliknya. tetapi saya pikir saya setuju dengan paragraf kedua Anda :)
Johannes Schaub - litb

4
tetapi saya pikir ini karena beberapa ppl mencoba menggunakan for_each dan teman-teman pada dasarnya untuk semuanya, bahkan untuk hal-hal seperti di mana simpel untuk-loop akan jauh lebih ringkas - membengkak 2 baris loop hingga 10 baris. Saya berharap lebih banyak orang menggunakan for_each dan teman-teman ketika lambda akan tersedia dalam C ++ 1x sekalipun
Johannes Schaub - litb

7
vektor menjadi dasar adalah intinya. Itu tidak selalu mendasar. Sekali, itu biasanya dilihat sebagai hal yang sangat rumit (menggunakan TEMPLATES) dan tidak efisien (itu bukan array mentah). Sesuatu yang mungkin dikhotbahkan para ahli, tetapi banyak orang tidak percaya.
jalf

2
Mungkin karena std :: for_each jarang yang Anda butuhkan dibandingkan dengan mengatakan ... std :: transform? Menggunakan algoritma membantu Anda untuk menghilangkan satu bug yang sangat umum: kondisi loop salah.
Edouard A.

vektor <bool> jelas bukan dasar ...
Kugel

6

Dalam pengalaman saya (Universitas Spanyol), sayangnya, norma untuk tidak mempertimbangkan bahasa itu sendiri. Mereka menggunakan bahasa yang paling mudah untuk mengajarkan pemrograman (yaitu Java), karena itu seharusnya mudah bagi guru dan siswa, dan kemudian mereka menggunakan C untuk kelas OS dan semacamnya.

C ++ diperkenalkan sangat sedikit (bagaimanapun juga), hanya untuk memberikan C kelas. Mereka tidak mendapatkan dorongan atau bahkan STL. Saya pikir mengikuti semua karakteristik dan cara berpikir C ++ mahal untuk guru dan siswa. Berapa banyak programmer C ++ di sini yang cukup tahu semua Boost libraries untuk menggunakannya untuk memberikan solusi yang lebih baik atau mendesainnya? Kita harus memiliki minat untuk mengikuti semua perpustakaan dan idiom baru.

Namun, seperti yang saya katakan, tampaknya pemrograman pada umumnya (dan bahasa pemrograman pada khususnya) tidak dianggap terlalu serius, karena tampaknya menjadi tugas temporal ketika mereka memulai suatu pekerjaan, kemudian lupa bagaimana memprogram ketika mereka naik di pohon perusahaan. Banyak perusahaan di sini, dan Universitas itu sendiri, merasa bahwa pemrograman dapat dilakukan oleh siapa saja.

Jika Anda mengikuti filosofi ini, maka bagi sebagian besar orang yang saya kenal, C ++ akan selalu menjadi "C dengan kelas".

Salam,


Sebagian besar itu sangat umum dalam Ilmu Komputer, dan secara keseluruhan, saya tidak berpikir itu hal yang buruk. (Tidak berfokus pada bahasa, yaitu. Bahasa yang diajarkan jelas harus diajarkan dengan benar).
jalf

+1: "(yaitu, tidak berfokus pada bahasa. Bahasa yang diajarkan aRE jelas masih harus diajarkan dengan benar)"
Jared Updike

6

Dalam pengalaman saya itu sangat tergantung pada usia produk / proyek perangkat lunak. Sebagian besar proyek baru yang saya ketahui menggunakan C ++ modern (RAII, STL, Boost). Namun, ada banyak proyek C ++ yang berumur lebih dari 10 tahun, dan Anda tidak melihat C ++ modern di sana.

Juga, perlu diingat bahwa beberapa implementasi STL paling populer telah rusak hingga 5 tahun yang lalu (MSVC <7.0 dan GNU <3.00)


4

Saya pikir penghalang terbesar yang saya temui adalah dukungan toolchain, terutama pada proyek lintas platform. Sampai beberapa tahun yang lalu, adalah umum untuk melihat catatan membangun yang mengatakan "x platform membutuhkan STLport untuk bekerja karena kompiler mereka borked". Bahkan sekarang, saya melihat masalah dengan orang-orang yang mencoba menggunakan beberapa dependensi pihak ketiga terkait dengan versi berbeda dari BOOST. Hal ini membuat menghubungkan tidak mungkin, artinya Anda harus kembali dan membangun kembali deps Anda dari awal.

Sekarang hampir semua orang telah berhenti menggunakan MSVC ++ 6, kekacauan STLport ada di belakang kami. Tetapi begitu TR1 keluar dari pintu, kita kembali ke "versi mana dari lingkungan yang mendukungnya dan melakukannya dengan benar" dan sekali lagi ini akan memperlambat adopsi.

Saya mengerjakan proyek yang dimulai pada C (bukan C ++) pada tahun 1992. Menyebarkan praktik-praktik modern di seluruh basis kode warisan tidak mungkin dilakukan. Demikian juga saya bekerja pada proyek lain yang jauh lebih dekat dengan ujung tombak bahasa C ++.


3

Banyak tim yang pernah saya ikuti dan dengar mempertimbangkan hal besar "apakah kita menggunakan pengecualian?" pertanyaan. Ini adalah kode untuk "apakah kita menggunakan C ++ modern?"

Setelah Anda tidak menggunakan pengecualian, Anda dilarang menggunakan kekuatan penuh dari bahasa dan perpustakaannya.

Tetapi banyak basis kode yang lebih lama adalah pengecualian-kurang, dan dianggap sulit untuk memilih pengecualian menjadi basis kode yang tidak mengharapkannya, atau menjadi tim yang tidak tahu bagaimana menggunakannya, jadi jawabannya dalam kasus tersebut adalah sering 'tidak.'

Dalam pengalaman saya, C ++ modern membutuhkan seseorang yang bersemangat tentang hal itu di tim, yang tidak tahan melihat apa pun yang kurang, untuk mendorongnya. Itu juga perlu untuk mengatasi keberatan dari mereka yang ingin menjadi lebih seperti kode warisan.

Meskipun saya tidak berpikir bahwa kode-kode C ++ lama akan hilang dengan sangat cepat, saya percaya ada lebih banyak orang yang bersemangat di dunia daripada lima tahun yang lalu. Mereka menghadapi pertempuran menanjak yang sama yang mereka hadapi lima tahun lalu, tetapi mereka lebih cenderung menemukan roh yang baik hati.


3

Sebelum menjawab pertanyaan seperti itu, Anda harus menyetujui apa itu "Modern". Ini tidak mungkin terjadi, karena "Modern" adalah kata yang tidak didefinisikan dengan baik, dan memiliki arti yang berbeda bagi orang yang berbeda. Judul buku Alexandrescu (Desain C ++ Modern) juga tidak terlalu membantu, karena sebagian besar buku tentang Templat Metaprogramming, yang merupakan area spesifik C ++ tetapi tidak berarti satu-satunya.

Bagi saya, "Modern C ++"! = "Metaprogramming Template". Saya akan mengatakan fitur C ++ di atas C akan jatuh ke dalam kategori ini:

  • Kelas (Konstruktor, Destruktor, RAII, Dynamic Casting, dan RTTI)
  • Pengecualian
  • Referensi
  • Struktur Data dan Algoritma di perpustakaan standar (STL)
  • iostreams
  • Template kelas dan fungsi yang sederhana
  • Metaprogramming template

Tak satu pun dari ini sangat modern, karena mereka semua sudah ada hampir 10 tahun atau lebih. Sebagian besar fitur ini berguna dan akan memungkinkan Anda menjadi lebih produktif daripada C lurus untuk banyak kasus penggunaan. Seorang programmer yang baik harus dan akan menggunakan semuanya dalam proyek berukuran layak, tetapi salah satu dari hal-hal ini tidak seperti yang lain:

Metaprogramming Templat.

Jawaban singkat untuk metaprogramming template hanya mengatakan tidak. Sayangnya untuk beberapa orang itu identik dengan "pemrograman C ++ Modern", karena buku itu, tetapi pada akhirnya itu menciptakan lebih banyak masalah daripada menyelesaikannya. Kecuali C ++ mengembangkan mekanisme pemrograman generik yang lebih baik seperti refleksi, itu akan tidak cocok untuk pemrograman generik, dan bahasa tingkat yang lebih tinggi seperti Python akan lebih cocok untuk kasus-kasus penggunaan tersebut. Untuk itu dan banyak alasan lainnya, lihat C ++ FQA


6
Metaprogramming templat IMHO hampir tidak pernah diperlukan untuk pemrograman aplikasi , di mana ia berfungsi hanya untuk menyediakan tingkat generalitas yang mungkin tidak perlu dengan biaya keterbacaan dan bug yang sulit dipahami. Tapi OTOH sangat berguna bagi para ahli ketika membangun perpustakaan (a la Boost), di mana generalisasi tambahan berguna dan mekanisme (jelek, rumit, membingungkan) dapat disembunyikan dari pandangan.
j_random_hacker

3
Anda benar bahwa metaprogramming template dapat digunakan dengan selera tinggi, jika dilakukan dalam jumlah sedang, khususnya di perpustakaan. Tapi terlalu sering saya melihat orang pergi terlalu jauh ke jalan metaprogramming template, dan program mereka menderita sebagai hasilnya. Saya tidak menentang metaprogramming, bahkan saya adalah pendukung kuat untuk itu, hanya saja fasilitas C ++ untuk itu cukup kasar.
Anton I. Sipos

2

Buku terbaik untuk belajar C ++. "Accelerated C ++" oleh Koenig & Moo, mengajarkan apa yang Anda gambarkan sebagai C ++ modern, jadi saya kira sebagian besar orang saat ini menggunakannya. Bagi kita yang telah menggunakan C ++ cukup lama (sejak pertengahan 80-an dalam kasus saya), C ++ modern sangat melegakan dari tugas-tugas membosankan menulis array, string, tabel hash kita sendiri (repeat ad nauseam).


1
Jangan bermaksud necro, tapi saya baru saja membeli buku berdasarkan rekomendasi ini. Kita harus melihat!
Andrew Weir

2

Saya telah melihat Pekerjaan C ++ di memang dan perpustakaan "modern" semakin banyak digunakan dalam deskripsi pekerjaan, MFC yang cukup "perpustakaan gaya lama" c ++ kurang digunakan.


1

Standarisasi bahasa pada akhir 1990-an adalah langkah pertama, itu memungkinkan pembuat kompiler untuk fokus pada set fitur "standar", juga memungkinkan bahasa untuk memperbaiki beberapa sisi kasar, yang muncul melalui proses standardisasi.

Ini pada gilirannya memungkinkan pengembangan kerangka kerja berdasarkan fitur standar bahasa, dan bukan pada fitur yang disediakan oleh implementasi kompiler tertentu. Perpustakaan Boost terutama dalam hal ini. Juga ini memungkinkan bahwa pengembangan baru didasarkan pada pekerjaan sebelumnya, sehingga memungkinkan solusi untuk masalah yang lebih kompleks.

Perubahan penting di sini adalah bagaimana kerangka kerja sebelumnya didasarkan pada gagasan kelas dasar dan kelas turunan (fitur run time). Tetapi sekarang sebagian besar fitur canggih sering didasarkan pada templat "rekursif" (fitur waktu kompilasi).

STL memiliki pro dan kontra, tetapi ia bertahan dalam ujian waktu, jika Anda menginginkan sesuatu yang berhasil dan sederhana, STL pasti memiliki sesuatu untuk membantu Anda memulai. Tidak ada gunanya menciptakan kembali roda (kecuali karena alasan didaktik).

Perangkat keras komputer juga telah membuat lompatan besar dari tahun 1990-an, maka memori dan CPU tidak lagi menjadi kendala bagi kompiler. Jadi sebagian besar optimisasi teoretis dari buku sekarang mungkin.

Langkah-langkah selanjutnya dari bahasa ini adalah dukungan pemrograman multi-core, yang merupakan bagian dari upaya standar 0x.


1

Iya dan tidak. Tentu saja untuk proyek-proyek baru semakin populer. Namun, masih ada hambatan untuk adopsi yang praktis, bukan politis, yang belum disebutkan orang lain. Ada banyak pustaka C ++ komersial yang menggunakan ABI dari kompiler kuno yang tidak mendukung fitur yang terlihat di Modern C ++, dan banyak perusahaan mengandalkan pustaka ini. Sun Studio di Solaris misalnya tidak dapat bekerja dengan Boost tanpa menggunakan STLport, tetapi perpustakaan komersial pihak ketiga mana pun yang ingin Anda gunakan akan memerlukan versi STL dari Sun. Kisah yang sama dengan GCC 2.95 dan Redhat Enterprise Linux.


-3

Ini amaizing betapa sedikit upaya yang dilakukan untuk membuat c ++ lebih stabil. Sistem peringatan sudah ada, tetapi tidak banyak berkembang. Bahkan lebih mudah untuk menembak diri sendiri dengan berjalan kaki daripada 10 tahun yang lalu. Tidak tahu kenapa, tapi c ++ masih bahasa favorit saya. :)


Saya sarankan membaca beberapa buku di utas ini sebelum membuat klaim tentang "sedikit usaha" yang dimasukkan ke dalam stabilisasi C ++ dan bahwa "bahkan lebih mudah untuk menembak diri sendiri dengan berjalan kaki daripada 10 tahun yang lalu."
Patrick Niedzielski

Tentu, std-library memberikan stabilitas pada alokasi memori dan manipulasi string. Sayangnya secara internal ia menggunakan konvensi pengkodean yang aneh, sehingga Anda akan berpikir itu ditulis oleh alien atau sesuatu. :)
AareP

2
Karena perpustakaan standar adalah spesifikasi, salahkan vendor kompiler Anda untuk menggunakan konvensi pengkodean internal yang aneh. Dan selain itu, konvensi pengkodean aneh = / = tidak stabil atau lebih mudah untuk menembak diri sendiri. Sebagian besar konvensi pengkodean (berbicara setidaknya tentang perpustakaan MSVC, dan mungkin tentang yang lain juga) dirancang untuk tidak mengganggu Anda sama sekali, sehingga Anda dapat melakukan hal-hal bodoh dan perpustakaan tidak perlu peduli. Jika Anda kode di luar spesifikasi C ++, itu hal yang berbeda.
Patrick Niedzielski

Perhatikan bahwa implementasi STL yang khas (terutama jika dibundel dengan kompiler tertentu) tidak harus menggunakan Standar C ++ untuk mengimplementasikannya sendiri. Ini dapat memanfaatkan pengetahuan khusus implementasi di dalam dirinya sendiri, untuk memberikan kode Anda jaminan yang dijanjikan oleh Standar. Namun, kode Anda sendiri harus hanya berpegang pada apa yang dijamin oleh Standar. Anda tidak dapat mempelajari jaminan Standar dengan memeriksa implementasi C ++ atau STL tertentu.
Tanz87

Jawaban ini ditulis satu dekade lalu. Pada saat itu, sungguh menakjubkan betapa banyak upaya yang dilakukan untuk membuat c ++ lebih stabil. Itulah salah satu alasan utama mengapa c ++ 0x butuh waktu lama untuk dirilis sebagai c ++ 11.
David Hammen
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.