Apa yang harus saya ketahui tentang C ++? [Tutup]

8

Saya baru-baru ini mulai belajar C ++, dan saya sangat menikmatinya.

Saya sering membacanya lebih mudah untuk menulis kode buruk dalam C ++ daripada di kebanyakan bahasa, dan itu jauh lebih dalam dari apa yang tampak.

Karena saya ingin menghindari penulisan kode yang buruk, saya bertanya-tanya apa sebenarnya yang seharusnya tidak saya lakukan, dan apa yang harus saya lakukan, untuk menulis kode yang baik dalam C ++.

DistantEcho
sumber
1
Buku C ++ apa yang sudah Anda baca, atau sedang Anda baca?
Fred Nurk
Belum ada. Saya mencari buku yang bagus juga, tetapi saya sudah menemukan terlalu banyak buku dan sekarang saya tidak tahu harus mulai dari mana ( stackoverflow.com/questions/388242/… )
DistantEcho
Jangan bingung dengan buku, saya akan merekomendasikan Robert Lafore ( amazon.com/Object-Oriented-Programming-4th-Robert-Lafore/dp/… ) atau C ++ Premier ( amazon.com/dp/0201721481/?tag= stackoverfl08-20 ) karena Anda akan maju dengan menulis lebih banyak kode Anda sendiri akan tahu apa yang harus Anda hindari. Karena Anda tidak tahu banyak tentang C ++ saya tidak berpikir Anda akan dapat memahami (Praktis) apa yang disarankan untuk dihindari dalam jawaban di sini.
Ranger
3
Ketika satu-satunya alat di kotak alat Anda adalah C ++, semuanya tampak seperti ibu jari ....
CurtisHx

Jawaban:

21

Perangkap

Ada begitu banyak jebakan dalam C ++, sehingga jika Anda tidak mengetahuinya, Anda akan membuat kode yang sangat tidak stabil, dengan banyak kebocoran memori dan buffer overruns. Dibandingkan dengan bahasa yang lebih modern dengan pengumpulan sampah, Anda harus melepaskan semua memori sendiri. Juga, kodenya sangat rendah. Tidak ada yang mencegah Anda menimpa kode program Anda sendiri (yang telah dieksploitasi oleh banyak peretasan IE).

Jadi selanjutnya yang harus Anda pelajari adalah praktik pemrograman yang mengurangi risiko ini, misalnya menggunakan pointer pintar untuk menangani objek yang bebas, membungkus array byte di kelas yang menangani data, dll.

Saya dapat merekomendasikan buku-buku Scott Meyers "C ++ Efektif" dan "C ++ Lebih Efektif".

Buku-buku itu pada dasarnya mengajari saya keindahan C ++. Perhatikan bahwa ini bukan buku pemula. Mereka menganggap bahwa Anda sudah terbiasa dengan bahasa tersebut.

Pete
sumber
4
"Accelerated C ++" oleh Koenig dan Moo adalah buku yang bagus untuk programmer C ++ baru, karena memperkenalkan template dan kelas dengan menunjukkan contoh penggunaan pertama, kemudian desain dan kreasi. Saya merasa lebih mudah untuk memahami mengapa menggunakannya dengan pendekatan itu.
Larry Coleman
Saya sudah mulai membaca C ++ yang Efektif, dan itu sangat membantu. Terima kasih !
DistantEcho
2
" Tidak ada yang mencegah Anda menimpa kode program Anda sendiri " Hah? Apa? Ini bukan kesalahan bahasa - memang, di sebagian besar sistem operasi ini sebenarnya tidak bisa dilakukan kecuali jika Anda secara aktif mengambil langkah untuk memungkinkannya. Dan program yang ditulis dengan buruk berpotensi dieksploitasi terlepas dari bahasa yang mereka gunakan. Ya, C ++ tingkat rendah dan, ya, ia memiliki kekurangan, tetapi jangan berlebihan dengan omong kosong seperti itu.
Nik Bougalis
@NikBougalis OS mencegahnya - dalam kasus di mana OS mencegahnya - tetapi C / C ++, secara desain, memberi Anda metode untuk melakukannya, dalam kasus di mana OS tidak mencegahnya; sedangkan banyak bahasa lain tidak. Jadi bukan benar-benar omong kosong untuk mencirikan ini sebagai masalah bahasa - tapi saya setuju bahwa poin aslinya agak berlebihan.
greggo
5
@ Grggo itu omong kosong - orang mungkin juga mengeluh bahwa cangkir kopi tidak melindungi Anda dari menuangkan garam ke dalam kopi Anda. Faktanya adalah ini: C dan C ++ tidak tahu apa-apa tentang program Anda atau sistem yang sedang berjalan. Bahasa tidak mungkin menjawab masalah "zomg! Program saya ditimpa" tanpa kita pertama-tama secara fundamental mengubah asumsi yang mendasari di mana bahasa dibangun.
Nik Bougalis
20

Idiom

C ++ mendukung beragam fitur. Demikian juga, seseorang dapat dengan mudah tergoda untuk menggunakannya dalam berbagai cara atau gaya. Sayangnya, itu tidak sesuai dengan banyak dari mereka dengan baik - dan dengan demikian menjadi membosankan, rawan kesalahan atau lambat jika dengan cara seperti itu.

Atau diutarakan secara berbeda, tanpa benar-benar mengetahui apa yang Anda lakukan, sangat mudah untuk menggunakan C ++ dengan cara yang salah (yang jauh lebih baik didukung dalam bahasa lain). Karenanya, belajar sambil melakukan bisa mengarah ke arah yang salah - jadi membaca buku yang bagus mungkin lebih penting daripada bahasa lain (lihat posting ini tentang topik yang sama).

Java misalnya adalah bahasa yang berorientasi objek secara inheren. Anda tidak dapat memprogramnya jauh berbeda. Namun dalam C ++, Anda bisa . Anda dapat menggunakannya seperti yang akan Anda lakukan di C atau Java - dan tidak ada cara C ++ unggul, jadi Anda sebaiknya tetap menggunakan C atau Java dalam kasus ini.

Karena itu, Anda benar-benar perlu mengetahui gaya dan idiom yang tepat untuk mendapatkan C ++ yang benar, sejak awal. Sayangnya, mereka bisa sangat kompleks pada awalnya, tetapi di sini ada beberapa - dari yang sederhana hingga yang canggih.

  • Menggunakan const
  • Jangan khawatir tentang optimasi mikro (haruskah saya inlineberfungsi, << atau *lain - lain?)
  • Menahan diri dari menggunakan pointer mentah atau array sedapat mungkin (terutama void*). Gunakan referensi atau petunjuk pintar
  • Tulis kode umum = Pahami templat
  • Memahami tajuk / file kode / preprosesor (tetapi hindari makro)
  • Gunakan STL (dan pahami konsep yang mendasarinya)!
  • Gunakan dorongan
  • Dapatkan pikiran Anda di sekitar objek seumur hidup dan ruang lingkup - Kelola RAII
  • Jangan menulis kode berorientasi objek (yaitu banyak polimorfisme runtime, warisan) sejak awal - ada banyak bahasa OO yang lebih baik di luar sana
  • Gunakan benda sebagai gantinya
  • Lebih suka polimorfisme statis
  • Gunakan fungsi waktu kompilasi
Dario
sumber
Terima kasih atas sarannya. Saya tidak benar-benar mengerti mengapa saya harus menghindari penulisan kode berorientasi objek; atau maksud Anda beberapa bagian dari OOP secara khusus?
DistantEcho
1
OOP tidak hanya berarti pemrograman dengan objek, itu menyiratkan pola-desain tertentu, polimorfisme runtime melalui pewarisan, hierarki kelas ... C ++ tidak benar-benar hebat dalam mengekspresikan ini - Anda memerlukan pointer (pintar) dan seringkali manajemen memori eksplisit untuk polimorfisme runtime, itu relatif lambat dan penuh jebakan (pernah lupa destruktor virtual?). Anda sering memiliki cara yang lebih bersih untuk mengekspresikan hal yang sama dengan objek murni dan misalnya pemrograman generik / polimorfisme statis.
Dario
2
@Niphra: ini bukan tentang tidak menggunakan OOP, ini tentang tidak menahan diri untuk OOP. C ++ menawarkan banyak paradigma, dan program C ++ bagus menggunakan sebagian besar, jika tidak semua, dari mereka.
Matthieu M.
3
Tidak ada yang idiom. Saran OOP dipertanyakan yang terbaik dan tampaknya lebih mengandalkan rasa takut daripada alasan teknis.
Edward Strange
+ msgstr "pernah lupa destruktor virtual". Ya - penting untuk mengaktifkan peringatan kompiler. Yang lain: 'fungsi mengembalikan nilai mungkin tidak benar-benar mengembalikan nilai' - dalam kasus di mana nilai yang dikembalikan memerlukan konstruktor. kaboom. IMHO bahwa peringatan harus diaktifkan secara default.
greggo
13

Kekuatan C ++ adalah bahasa yang mengagumkan. Kelemahan C ++ adalah bahasa yang mengagumkan. Ini bisa menjadi awe-ful dan sekaligus mengerikan.

Jika Anda ingin mempelajarinya - dan tidak ada alasan Anda tidak boleh - Anda harus mempelajarinya dengan baik. Anda harus banyak membaca . Ada beberapa buku yang akan membantu Anda dalam perjalanan: C ++ yang dipercepat akan membantu Anda memulai, terutama jika Anda melakukan latihan. C ++ yang Efektif, STL Efektif, C ++ Luar Biasa, dan seri lanjutannya adalah yang terbaik dalam permainan untuk petunjuk ukuran gigitan tentang cara meningkatkan cara Anda bekerja.

Kaz Dragon
sumber
4

Saya pikir satu hal yang akan membantu Anda sepanjang jalan kode yang baik adalah pengalaman . Untuk saat ini, cukup terjebak dalam bahasa dan jangan terlalu khawatir tentang "praktik pengkodean terbaik" sampai Anda cukup nyaman dengannya untuk mulai mencari cara untuk meningkatkan penggunaan Anda. Anda akan belajar mengenali apa yang baik dan apa yang buruk. Setelah bahasa Anda turun, maka Anda dapat melihat ke belakang dan berpikir "ok, saya harus menerapkan ini secara berbeda", atau "ini terlihat berantakan, bagaimana saya bisa memperbaikinya?"

Saya memikirkannya seperti ini : Jika Anda belajar bahasa lisan yang baru, Anda tidak langsung menyelam dan mempelajari setiap aturan tata bahasa sebelum Anda mulai belajar kata-kata sederhana atau bagaimana mengatakan "di mana halte bus?". Pemrograman (IMO) seperti bahasa kedua (atau ketiga, keempat, dll). Perlakukan itu seperti Anda akan bahasa lain dan belajar dengan melakukan. Sisanya akan datang seiring waktu.

badgerr
sumber
1

Saya sering membacanya lebih mudah untuk menulis kode buruk dalam C ++ daripada di kebanyakan bahasa, dan itu jauh lebih dalam dari apa yang tampak

klarifikasi: dalam C ++ lebih mudah untuk menulis kode buruk secara tidak sengaja daripada dalam bahasa lain. Anda dapat menulis kode buruk dalam bahasa apa pun tetapi dalam C ++ Anda berangkat dengan niat terbaik tetapi seringkali berakhir di tempat yang tidak terduga karena C ++ - setelah Anda berpindah dari "pemula" untuk mengatakan "pemula", Anda mendapat kesan salah bahwa C ++ lebih mudah dari yang sebenarnya. Tetapi C ++ sedang berkembang dan semua pustaka templat baru membuat hidup Anda lebih mudah (dan lebih aman).

AndersK
sumber
2
Ini juga tergantung pada bagaimana Anda belajar C ++. Jika Anda mulai mempelajarinya sebagai C yang disempurnakan, Anda lebih mungkin mendapatkan masalah pada tahap itu daripada jika Anda hanya mempelajarinya sebagai C ++.
David Thornley
Waktu untuk kutipan Stroustrup wajib: "C membuatnya mudah untuk menembak diri sendiri di kaki; C ++ membuatnya lebih sulit, tetapi ketika Anda melakukannya pukulan seluruh kaki Anda"
Mawg mengatakan mengembalikan Monica
-1

Dua hal:

  1. Bagaimana cara kerja Manajemen Memori menggunakan C ++?
  2. Bagaimana Pointer memengaruhi Manajemen Memori di C ++?
Rachel
sumber
1
ini jauh lebih ke c ++ daripada hanya memori ...
Nazgob