Mengingat C ++ '11 Disetujui, Apakah Ini Berubah Bagaimana Pemula C ++ Belajar Bahasa? [Tutup]

21

Saya ingin belajar C ++ untuk sementara dan mengambil Programming Komputer AP di Sekolah Menengah (kembali ketika itu C ++ dan bukan Java). Saya menikmati C dan belum menemukan waktu untuk belajar C ++ atau saya hanya akan kembali ke C # di mana saya jauh lebih produktif.

Pertanyaan saya adalah ini: mengingat bahwa C ++ '11 telah disetujui (walaupun saya tahu belum sepenuhnya diimplementasikan) apakah ini mengubah cara saya harus mendekati pembelajaran C ++? Saya memiliki C ++: Referensi Lengkap Oleh Herb Schildt yang berasal dari tahun 1998. Apakah standar yang baru disetujui membuat belajar dari buku-buku seperti itu kurang penting daripada beberapa tutorial / buku baru yang mencakup hal-hal dari standar? Apakah ada manfaat dari belajar dari buku-buku lama?

Jetti
sumber
9
Oof. Schildt. Saya tidak dapat berbicara dengan kualitas bahan C ++-nya, tetapi bahan C-nya di bawah standar untuk waktu yang lama (bahkan edisi terbaru C: TCR masih memiliki beberapa kesalahan non-sepele). Saya akan merekomendasikan mencari karya yang lebih baru oleh penulis yang berbeda.
John Bode
C ++ 11 tidak mengubah dasar-dasar C ++ yang harus dipelajari untuk melakukan apa pun yang diperkenalkan dalam revisi terbaru dan tidak ada dalam versi C ++ sebelumnya.
Ramhound
11
Jangan pernah mempercayai buku karya Herb Schildt. Sungguh, sementara sebagian besar buku C ++ di luar sana ada buku buruk (dan saya tidak mengacu pada masalah gaya di sini, tapi kesalahan faktual yang mencolok dan mempromosikan gaya pemrograman yang terkenal mengarah pada kode buggy), buku-buku Schildt sangat buruk, namanya menjadi semacam meme.
sbi
4
@Ramhound: Saya tidak setuju. Jika itu benar, kita masih akan mempelajari manajemen sumber daya manual terlebih dahulu, dan hanya dengan cara yang lebih aman untuk melakukan sumber daya dinamis. Untungnya, ini (perlahan) berubah. Kemungkinan baru, bahkan jika itu "hanya" di perpustakaan, membutuhkan idiom baru. Jika Anda mulai dengan bahasa, mengapa harus belajar idiom yang lebih tua terlebih dahulu, hanya dengan harus melupakannya nanti?
sbi

Jawaban:

16

Benar. Hari-hari ini tiga hal yang biasanya dalam pelajaran 2 harus banyak bergerak, jauh di kemudian hari:

  • string sebagai array dari char *, strlen, metode strxxx, dan sebagainya
  • array secara umum dan pointer aritmatika
  • hapus apa yang baru, hapus [] apa yang baru [], dan bahkan destruktor

Hal-hal yang biasanya ada dalam pelajaran 99 ini harus bergerak jauh, jauh lebih awal

  • templat sebagai hal yang digunakan (tulis, jangan banyak)
  • std :: string
  • std :: shared_ptr <>
  • std :: vector <>, iterators, koleksi lainnya

Evey raw pointer harus segera diberikan ke pembungkus pointer cerdas (saya akan mulai dengan yang dibagikan, dan mempertimbangkan yang unik nanti karena membutuhkan penjelasan std :: move dan referensi nilai). Melakukan hal ini akan membuat belajar C ++ terasa sangat mirip dengan belajar Java atau C #, di mana Anda belajar perpustakaan pada saat yang sama dengan bahasa. Ini akan menghilangkan banyak pekerjaan ingatan, dan membuat orang tidak terlalu khawatir dengan gotcha.

Saya juga akan mengerjakan lambdas ke dalam gambar pertama kali kami ingin beralih melalui koleksi dan melakukan sesuatu untuk setiap elemen.

Penafian: Saya sedang menulis kursus C ++ untuk Pluralsight sekarang dan menggunakan pendekatan ini. Modul terakhir adalah "memahami kode orang lain" dan di situlah saya akan meletakkan hal-hal yang membingungkan seperti char * string, manajemen memori manual, aritmatika pointer, dan sebagainya.

Pembaruan: beberapa orang bertanya mengapa keberadaan C ++ 0x menginspirasi hal-hal pengajaran yang bisa diajarkan dengan C ++ 03. Saya pikir itu beberapa hal:

  • pointer benar-benar pintar, yang ramah koleksi, menghilangkan kebutuhan untuk hal-hal seperti "array pointer Karyawan" yang menyebabkan kita selalu kembali pada yang baru / hapus, aritmatika pointer dll
  • otomatis menghilangkan rasa sakit dari deklarasi iterator
  • lambdas membuat meramalkan sesuatu yang orang biasa akan lakukan
  • bahkan sesuatu yang sepele seperti parsing >>dengan benar menghilangkan gotcha yang akan ada ketika mendeklarasikan beberapa template template
  • dan seterusnya

Cara saya melihatnya, ada hal-hal yang bisa kita ubah tentang cara kita mengajar C ++ beberapa waktu yang lalu, tetapi beberapa dari kita menahan diri karena kita masih membutuhkan cara sekolah lama untuk mundur atau karena mengajar itu hanya melibatkan banyak pengetahuan misterius.

Kate Gregory
sumber
3
Mengapa Anda merasa bahwa manajemen memori manual harus diajarkan nanti? Saya pikir ini penting untuk diketahui dan memberi lebih banyak penghargaan ketika belajar pointer cerdas. Saya harus belajar manajemen memori (dan array char) di C dan itu membuat saya menghargai RAII dan std :: string lebih dari yang saya kira akan saya lakukan jika saya tidak harus melakukannya.
Jetti
1
Contoh Anda sebagian besar berlaku untuk C ++ 98 vs. C ++ standar, bukan C ++ 03 vs. C ++ 11. Saya kira diberikan lambda, std::for_each()akan jauh lebih populer daripada dulu, autoakan sangat penting, dan sintaks deklarasi fungsi baru (dalam hubungannya dengan decltype) akan menjadi cukup banyak digunakan dalam kode template. Itu adalah hal-hal yang tidak diajarkan buku C ++ saat ini. Tapi, ya, secara umum saya setuju dengan Anda ( +1). Ketika saya mulai memberikan kursus-kursus C ++, saya mulai dengan Accelerated C ++ , dan meskipun kursus saya mulai semakin menyimpang darinya, itu tetap berlaku pada prinsip yang mendasarinya.
sbi
3
@ Jetti: Saya jarang melakukan manajemen sumber daya manual, dan jika saya melakukannya, itu untuk mengimplementasikan kelas RAII. Namun, saya menggunakan banyak dari kelas-kelas itu. Menurut itu, penggunaan barang RAII tampaknya lebih penting daripada berurusan dengan sumber daya mentah dan karenanya harus diajarkan sebelumnya, dengan lebih banyak penekanan.
sbi
1
@ sbi: Saya harus setuju dengan Anda di sana - sebagian besar contoh ini tampak seperti Modern C ++ 101 dari 2006, bukan hal baru tentang C ++ 11.
DeadMG
2
@ Jetti: Langkah paling penting untuk menguasai C ++ adalah mempelajari semua cara di mana Anda dapat menghindari manajemen memori manual. Ini benar-benar sesuatu yang harus diajarkan "nanti", begitu Anda telah belajar sejauh mana Anda bisa melalui manajemen memori "otomatis".
jalf
9

Cukup banyak, ya. Fakta sederhananya adalah bahwa dalam C ++ 98 dan 03, banyak praktik yang baik pada dasarnya tidak dapat digunakan karena kualitas dukungan bahasa yang buruk untuk mis pemrograman fungsional. Sekarang setelah lambda ada dan berfungsi, orang cenderung menerima antarmuka fungsional jauh lebih baik daripada sebelumnya, dan pemrograman generik bahkan lebih kuat dari sebelumnya.

Pada tahun 1998, orang baru saja mulai menemukan cara menulis kode berkualitas tinggi, aman, cepat menggunakan C ++, dan banyak kode adalah "C adalah Kelas". Dalam C ++ 11, itu sangat berbeda - idiom seperti copy dan swap dan Aturan Tiga (sekarang Lima) sudah dikenal dan didefinisikan, dan lebih banyak lagi jenis pengelolaan sumber daya telah menjadi Standar, seperti shared_ptrdan di unique_ptrmana Standar sebelumnya hanya meninggalkannya sebagai lubang menganga.

Anda dapat melihat pertanyaan ini untuk daftar bahan referensi yang bagus tentang C ++.

DeadMG
sumber
1
Sebenarnya saya akan menempatkan awal dari akhir "C dengan kelas" beberapa tahun lebih awal dari tahun 1998, tetapi secara umum Anda tentu benar, dan saya tidak akan tawar-menawar lebih dari setengah dekade. +1dari saya.
sbi
4

Saya tidak tahu buku spesifik yang Anda sebutkan. Tetapi secara umum Anda dapat mengatakan, bahwa semua dasar-dasar tentang sintaks C ++, tipe data dan OOP masih berlaku. Hal yang sama juga berlaku untuk perpustakaan STL yang disebutkan dalam kebanyakan buku pemula.

Meskipun sebuah buku setua dari tahun 1998 mungkin telah melewatkan beberapa pembaruan dan perkembangan dalam gaya pemrograman C ++, yang terakumulasi dalam komunitas selama bertahun-tahun. Saya akan mencari sumber daya yang sedikit lebih terkini. Ada lebih dari cukup tutorial dan dokumen online gratis yang akan memberi Anda awal yang baik. Beberapa dari mereka bahkan mungkin menyebutkan C ++ 0x.

C ++ 0x pasti akan banyak berubah tentang bagaimana programmer melihat dan menggunakan bahasa di masa depan. Tetapi ini akan mempengaruhi proyek yang lebih kompleks di mana fitur baru mulai masuk akal. Bagi seorang pemula, ini seharusnya tidak menjadi masalah dan Anda dapat berkonsentrasi untuk merasa nyaman dengan konsep yang ada, itu sudah cukup untuk dipelajari. Sebagai contoh, sebagian besar buku pemula tidak terlalu membahas tentang templat, jadi templat variadik baru bukanlah yang perlu Anda ketahui sekarang.

Mungkin melihat daftar perubahan . Setidaknya beberapa konsep seperti range based for loop kemungkinan besar akan muncul di tutorial baru bahkan untuk pemula. Jadi ada baiknya untuk melihatnya.

thorsten müller
sumber
Terima kasih! Apakah Anda mengetahui ada sumber daya daring atau buku yang layak?
Jetti
2
Tidak, situs cplusplus sering disebut sebagai sumber yang tidak boleh, pernah dirujuk ke siapa pun yang Anda ingin benar-benar menulis kode yang baik.
DeadMG
@DeadMG Apakah Anda memiliki situs web alternatif?
TheLQ
@TheLQ: Anda akan mendapatkan lebih jauh dengan referensi MSDN, atau cprogramming.com.
DeadMG
@ Jetti: Saya tidak mengetahui adanya bahan untuk menggunakan C ++ 11 untuk mengajar C ++. Semua yang saya lihat mengajarkan C ++ 11 di atas C ++ 03. Untuk mempelajari yang terakhir lihat stackoverflow.com/questions/388242/… .
sbi
3

Tentu saja, berkenaan dengan teknologi apa pun yang terkait, menjadi up to date dengan materi terbaru selalu merupakan langkah yang cerdas, namun, perubahan yang diperkenalkan dalam C ++ 11 dirancang untuk tidak mengganggu. Jika Anda baru mengenal C ++ (atau pemrograman secara umum), ini bukan sesuatu yang saya khawatirkan.

Selain itu, jika Anda seorang programmer profesional, Anda bisa bertaruh Anda akan bekerja pada kode orang lain di masa depan, sehingga selalu ada nilai dalam memahami cara kerja sesuatu, bahkan jika itu adalah teknik yang terdepresiasi dalam praktiknya.

Leo
sumber
Terima kasih atas tanggapan Anda, saya pikir itu setidaknya akan membantu saya melihat kode lama ketika menggunakan sumber daya lama.
Jetti
Bagaimana bisa lambda,, autodan eksekusi fungsi asinkron melakukan apa-apa selain "goyang perahu"?
sbi
1
Saya berpendapat ada perbedaan antara pengenalan alat-alat baru dan perubahan besar dalam filosofi desain (seperti yang kita lihat dengan PHP, misalnya)
leo
1
@leo: Saya tidak setuju. Pengenalan fasilitas STL, smart pointer, dan template kaya telah benar-benar mengubah filosofi desain utama C ++. Hampir setiap peningkatan perpustakaan sama sekali berbeda dari rata-rata perpustakaan C ++ Anda tahun 90-an.
sbi