C ++ untuk Pengembang C #

24

Saya tahu C # cukup baik (otodidak, sedih) dan perlu melakukan beberapa pemrograman C ++ untuk aplikasi Windows. Saya telah dapat menemukan banyak informasi untuk pengembang C ++ yang belajar C # tetapi belum dapat menemukan banyak tentang belajar C ++ ketika Anda sudah tahu C #. Adakah yang menemukan ikhtisar dasar-dasar yang bagus?

MSDN memiliki perbandingan tetapi tidak terlalu mendalam.

Saya dapat mengumpulkan beberapa sumber tetapi menemukan sesuatu di luar sana - Saya tidak dapat menemukannya. Terima kasih atas bantuan Anda.

Mark Williams
sumber
27
Kenapa "sedih"? Jangan merendahkan diri seperti itu. Saya tidak tahu pengembang C # yang tidak belajar sendiri. Banyak di antaranya adalah pengembang yang luar biasa .
Steven Evers
6
@SnOrfus - terutama karena akademisi menolaknya karena alasan pseudo-politik yang tidak rasional.
Rei Miyasaka
5
Nasihat pertama saya adalah jangan mencoba mempelajari C ++ dalam konteks C #. Karena C # bukan C ++ dan C ++ bukan C #. Itu mungkin pernyataan bodoh untuk dibuat tetapi C # membuatnya sulit untuk melakukan pointer salah, dan sangat mudah untuk melakukannya salah dalam C ++, bahkan dengan alat yang membuatnya sangat mudah. Saya ingin menambahkan ada banyak hal yang sama-sama dimiliki oleh kedua bahasa. Ini pada dasarnya seperti mengatakan sebuah apel dan jeruk keduanya ditanam di pohon dan memiliki biji dan dengan demikian mereka buah.
Ramhound
2
@ReiMiyasaka, tidak seperti bagaimana pengembang C # melihat VB .NET.
Kyralessa
1
@ Kyralessa Yang juga agak disayangkan. Saya pikir ini bukan masalah politik karena merendahkan VB.NET demografis - karena sebagian besar pengguna awal C # memiliki latar belakang C / C ++. Sekolah saya menggunakan VB.NET untuk kursus pemula. Mereka tampaknya berpikir bahwa VB.NET adalah mainan, dan karenanya tidak seharusnya merusak pikiran siswa seperti halnya C #.
Rei Miyasaka

Jawaban:

10

Utas ini pada C ++ untuk pengembang Java sangat mirip dan harus bermanfaat, terutama posting Mark Byer:

Baca buku-buku ini:

Mungkin hal yang paling penting untuk diingat adalah memahami perbedaan teknik manajemen memori antara C # / Java dan C ++ .

Salah satu profesor saya berasal dari latar belakang Jawa dan mengajarkan kursus pengantar C ++ yang berpikir itu akan menjadi kue. Tidak ada yang dia jelaskan masuk akal bagi siapa pun. Dia mengalami kebocoran ingatan di mana-mana. Aritmatika pointer-nya mengerikan. Dia tidak pernah sampai ke bagian OOP dari silabus (terima kasih Tuhan). Hampir tidak ada yang dia tunjukkan yang akan dikompilasi. Dia tidak mengerti bahwa char[]perlu penjaga \0. Jangan berakhir seperti dia.

Rei Miyasaka
sumber
4
Sayang sekali bahwa tak seorang pun di C ++ menggunakan char[]kemudian , bukan?
DeadMG
5
@DeadMG Saya tidak bisa mengerti maksud Anda. Hanya karena char[]jarang digunakan dalam C ++ tidak berarti itu tidak diajarkan atau tidak seharusnya diajarkan. char[]masih penting untuk diperhatikan karena C ++ adalah superset dari C, dan sangat penting bahwa itu dipahami dengan benar jika itu harus dipelajari sama sekali.
Rei Miyasaka
7
Ya- waktu yang sangat sangat, sangat lama setelah mereka menguasai setiap aspek bahasa lainnya. Saya lebih suka mengajar spesialisasi template parsial siswa baru dan SFINAE. Di C ++, Anda menggunakan std::string, dan jika Anda harus interop dengan C API, maka itulah gunanya c_str(). Tidak perlu bagi programmer untuk berurusan dengan char[]atau penghentian NULL dalam semua itu. Penanganan string gaya-C sepenuhnya dan benar-benar tidak digunakan lagi untuk setiap kemungkinan penggunaan kecuali interop dengan kode C lama, yang ditangani dengan sangat baik oleh c_str().
DeadMG
4
Tidak ada yang namanya pengajaran char[]benar, karena semua penggunaan char[]salah. Profesor Anda mungkin akan baik-baik saja jika dia tetap menggunakan C ++ alih-alih C.
DeadMG
4
Anda akan melihat kode C yang digunakan dalam C ++ apakah Anda menulis C atau tidak sendiri, dan akibatnya, jika Anda belajar C ++, Anda perlu belajar C. Seperti yang saya katakan, saya tidak memaafkannya, tetapi fakta dari materi adalah bahwa sekolah-sekolah umum mengajarkan C dan kemudian taktik pada C ++ kemudian, karena siswa perlu diajarkan hal-hal seperti OS desain - yang, tidak termasuk BeOS dan OS penelitian tertentu, benar-benar membutuhkan C. untuk itu, Anda lakukan perlu memahami C string. Sekali lagi, untuk ketiga kalinya, jika saya memiliki cara saya, saya tidak akan mengajar C ++ sama sekali kepada siswa tahun pertama, dan untuk yang terakhir kalinya, itu sepenuhnya tidak penting.
Rei Miyasaka
14

Sayangnya, tidak banyak tentang C ++ yang mendasar, jadi saya tidak akan terlalu berharap. Selain itu, ada sedikit Anda akan tahu tentang C # yang bahkan dapat ditransfer ke C ++ dari jarak jauh, jadi saya tidak akan mengharapkan adanya materi spesifik yang mencakup sudut itu. Anda harus belajar dari awal.

DeadMG
sumber
3
Itu akan menjelaskan mengapa tidak banyak di luar sana. Setelah membaca C ++ sedikit akan terlihat bahwa Anda benar - ini adalah dunia yang sama sekali berbeda. Terima kasih atas bantuan Anda.
Mark Williams
1
+1, ada sedikit yang akan Anda ketahui tentang C # yang bahkan dapat ditransfer ke C ++ dari jarak jauh . Saya telah belajar ini dengan cara yang sulit.
ApprenticeHacker
Sebagai titik cepat, saya akan mengatakan ada banyak C ++ yang mendasar. Pointer / referensi yang membedakan dan template C ++ dapat membuat kepala Anda berputar pada awalnya, tetapi ketika sampai ke sana masih ada kelas, coutdan cara-cara sederhana untuk mencapai tujuan sederhana
Kieren Johnstone
1
@KierenJohnstone: Anda mungkin berarti "cara lambat dan pengecualian-tidak aman untuk melakukan hal-hal" seperti "peluruhan array-to-pointer" dan hal-hal semacam itu.
DeadMG
12
Jawaban yang benar-benar tidak membantu.
dbracey
9

Tidak ada perbaikan yang mudah untuk ini, C ++ tidak terlalu sulit, tetapi tidak mudah untuk pemula.

Saya akan merekomendasikan membaca dasar-dasar pemrograman C (untuk mendapatkan landasan dari hal-hal tingkat rendah yang akan Anda temukan), kemudian belajar STL, diikuti oleh artikel dari orang-orang seperti Scott Meyers. Ini satu untuk Anda mulai, karena menunjukkan bagaimana Anda harus menulis C ++ modern, dibandingkan dengan C-dengan-kelas.

gbjbaanb
sumber
2
+1: Saya akan menambahkan untuk mendapatkan buku-buku Meyer (seri C ++ / STL efektif). Saya punya semuanya, dan mereka luar biasa.
Steven Evers
12
-1 untuk reading up on C programming. Saya pikir ini lebih banyak ruginya daripada baik dan mencakup gagasan bahwa C dan C ++ adalah bahasa yang perlu dipelajari bersama.
sebastiangeiger
2
@sebastiangeiger: Anda kehilangan titik bahwa ketika seseorang harus bekerja dengan aplikasi C ++ dunia nyata yang ada, Anda paling sering harus berurusan dengan konstruksi C-like. Karenanya +1, setidaknya untuk menghilangkan downvote Anda.
Doc Brown
5
@DocBrown Mungkin, tapi saya sedang mengerjakan salah satu dari proyek warisan C ++ saat ini dan saya dapat mengatakan bahwa para pendahulu saya sebagian besar hanya programmer C yang menyimpan file sumber mereka sebagai * .cpp. Saya menemukan bahwa saya menggunakan lebih sedikit deletedan array C dan hal-hal lain yang tidak disarankan dalam C ++ daripada yang mereka lakukan, yang saya atribut untuk TIDAK secara eksplisit mempelajari C. C relatif sederhana, Anda dapat mengetahui dengan cepat apa yang dilakukan kode.
sebastiangeiger
3
@ gbjaanb: Tidak ada, sama sekali, tentang STL yang membutuhkan pengetahuan mallocdan free. Seorang C ++ dev yang hebat akhirnya ingin tahu tentang mereka. Memulai dengan mereka adalah hal yang sangat berbeda.
DeadMG
7

Saya tidak yakin apakah Anda masih mencari bahan, saya menemukan artikel ini beberapa bulan yang lalu. Itu bukan buku (hanya 53 halaman). Pendahuluan mengatakan semuanya:

This is a somewhat short guide to the important things to know if you are a C# programmer and find yourself needing or wanting to work in C++

http://geekswithblogs.net/mikebmcl/archive/2012/02/02/c-to-c-ndash-a-somewhat-short-guide.aspx

Dan ada juga pos pembaruan:

http://geekswithblogs.net/mikebmcl/archive/2012/02/14/c-to-cndasha-somewhat-short-guide-update-1.aspx

Selamat belajar :)

Chris
sumber
Berhati-hatilah saat menggunakan dokumen ini, ini menunjukkan C ++ dengan cara yang sangat berpusat pada Microsoft (juga dikatakan demikian). Itu tidak membedakan antara fitur C ++ 03 dan C ++ 11, dan kadang-kadang bahkan menunjukkan ekstensi non standar sebagai solusi yang lebih disukai. Anda akan berakhir dengan kode yang sangat tidak dapat ditonton jika Anda mengikuti panduan itu.
Fabio Fracassi
4
  • Carilah manajemen memori. Dapatkan ide yang jelas tentang cara kerja pointer dan referensi di C ++ berbeda dengan C #. Juga, RAII, manajemen memori manual dan pointer pintar akhirnya.
  • Templat dan obat generik terlihat serupa tetapi berbeda jenis. Ketahui internal tentang cara kerja templat.
  • Ada beberapa perbedaan sintaksis yang kecil namun menarik. Pelajari mereka.
  • Anda telah terbiasa dengan STL daripada .net BCL. Anda mungkin akan kehilangan beberapa bit yang baik jika memiliki kecanduan LINQ.
  • Ada beberapa perbedaan desain mendasar antara C ++ dan C #. Jadi, Anda tidak bisa sekadar menyampaikan ide. Apa pun yang Anda bangun dengan C ++, Anda harus mendesain dari awal.
  • Semoga berhasil
Gulshan
sumber
1

Saya pikir itu baik bahwa Anda tidak menemukan terlalu banyak tutorial C # to C ++. Mereka mungkin mengacaukan otak Anda. Ini sangat mirip dengan mencoba belajar mengendarai sepeda motor terlebih dahulu dan kemudian beralih ke sepeda (bukan anologi yang sepenuhnya tepat tetapi Anda mendapatkan ide). Lebih baik bagi Anda untuk mengambil buku baru tentang C ++. Karena Anda sudah terbiasa dengan konsep OOP, Anda dapat melewatkan pengantar panjang untuk konsep OOP (mereka dimaksudkan untuk orang yang bermigrasi dari C ke C ++). Atau pergi langsung ke buku referensi yang dimaksudkan untuk tingkat pemula hingga menengah atau menengah.

DPD
sumber
1

Saya akan merekomendasikan pergi ke Rosetta Code dan membandingkan keduanya. Saat Anda berada di sana, simpan tautan idiom C ++ dan cobalah untuk menemukannya. Kemudian luangkan waktu pada ranah pointer / referensi / memori / destruktor. Setelah itu belajar tentang preprocessor - itu benar-benar bisa menjadi teman Anda ketika datang untuk menyembunyikan uglies, saya agak merindukannya. Akhirnya, STL.

Menandai
sumber
1

Jadi, sekitar satu tahun yang lalu saya berada di kapal yang sama dengan Anda: otodidak c # dev yang merasakan kebutuhan untuk belajar C ++. Memang, saya berhenti dan mulai beberapa kali. Pada upaya ketiga saya, saya akhirnya terjebak melewatinya.

Apa yang penting untuk dipahami adalah bahwa, dalam hal C ++ dan C # metodologi, Anda mungkin akan menghabiskan banyak waktu memahami apa metode manipulasi data melalui pointer dan referensi benar-benar berarti, serta kapan dan bagaimana menggunakannya mengingat keadaan.

Yang menyenangkan tentang C ++ adalah bahwa alokasi tumpukan objek cukup sederhana untuk sebagian besar, dan Anda harus mengalokasikan objek dengan cara ini jika program Anda akan memenuhi persyaratan yang ditentukan dalam metode ini. Jika tidak, Anda mengandalkan pointer untuk kecepatan, efisiensi, dan pembersihan cepat. Saya sarankan membaca ini: http://www.parashift.com/c++-faq-lite/ karena akan memberi Anda BANYAK pemahaman teknis tentang bagaimana C ++ bekerja di bawah tenda.

Biarkan saya memberi Anda sebuah contoh:

Di C ++ terdapat implementasi konstruktor ini yang dikenal sebagai "daftar inisialisasi", yang berbeda dari menginisialisasi anggota kelas di tubuh konstruktor. Mengapa? Karena kecuali jika jenis yang diinisialisasi adalah primitif, kompiler akan benar-benar membuat banyak, dan salinan yang tidak perlu dari objek yang dibuat ketika dialokasikan di badan ctor. Ini berpotensi mengurangi kinerja, tergantung pada kompiler serta persyaratan skala aplikasi.

Tahu apa delegasi itu? Nah, di C ++ itu dikenal sebagai pointer fungsi . Bahasa ini cukup sulit untuk dikuasai pada awalnya, tetapi jika Anda ingin menjadi hebat ... itu pasti diperlukan.

C # mudah ... sangat mudah.

tentang kosong
sumber
C # Delegasi dan pointer fungsi c sangat berbeda. Delegasi lebih dekat ke functor di C ++ daripada ke pointer fungsi.
CodesInChaos
-2

Percayalah, Pilih buku yang bagus tentang C ++ (masih banyak lagi, lakukan pencarian) dan mulailah belajar ...

Muhammad Hewedy
sumber
1
BTW, belajar beberapa C sebelumnya (pointer, array, struct) akan bagus
Muhammad Hewedy
7
Belajar C sebelum C ++ akan melemparkan Anda kembali ke zaman batu. Saat ini, kami sangat jarang menggunakan array dan pointer di C ++. Bahasa telah berevolusi jauh dari mereka sejak lama.
fredoverflow
7
@Muhammad: Semua orang lebih suka kecepatan, keamanan, kemudahan perawatan.
DeadMG
3
@DPD: Ya, banyak programmer C ++ profesional, termasuk Bjarne Stroustrup (penemu bahasa), tidak setuju dengan Anda. Buku terbarunya mengajar menggunakan objek dan template dari awal, sedangkan array dan pointer tidak dibicarakan sama sekali sebelum Bab 17 (halaman 500 dan sesuatu).
fredoverflow
2
@DeadMG. Mungkin, tetapi Anda tidak dapat mengembalikan evolusi C-> C ++. Jika Anda membenci bagian C dari C ++, pergilah ke Java atau C #. Secara pribadi, saya menemukan bahwa berkonsentrasi pada pointer dan array di C sebelum pergi ke C ++ membantu saya dalam karir saya. Tentu, Anda dapat membuat kode seluruh aplikasi tanpa mereka tetapi jika Anda menginginkan manfaat polimorfisme, Anda perlu mengetahui petunjuknya. Berapa banyak pola penting GoF yang dapat diimplementasikan tanpa petunjuk? Itu tidak sama untuk teman-teman saya yang menghindari bagian "sulit" ketika belajar C. Kebanyakan dari mereka merasa sulit untuk memahami polimorfisme.
DPD