Apa pertanyaan wawancara C ++ terbaik? [Tutup]


28

Jika Anda bisa bertanya kepada seorang programmer C ++ satu pertanyaan untuk mengukur keterampilan C ++ mereka, apakah itu?

Pertanyaan yang menurut saya paling baik adalah: Dapatkah Anda memanggil "hapus ini;" di dalam fungsi anggota? (Saya menempatkan ini sebagai tautan sehingga Anda dapat memikirkannya terlebih dahulu, lalu pergi ke The Best C ++ Interview Question - Ever! Untuk melihat jawaban yang benar.)

Saya tidak menanyakan ini karena saya berharap kebanyakan orang tahu jawabannya. Jika mereka melakukannya, itu tidak akan menjadi pertanyaan yang berguna. Saya bertanya untuk melihat apakah mereka dapat mengerjakan jawaban mereka yang benar dan bagaimana mereka melakukannya.

Jawaban:


8

Saya akan menanyakan alasan mengapa fungsi anggota virtual tidak dapat digunakan dengan template di C ++. Tentu saja, hanya ada beberapa orang yang benar-benar dapat menjawab pertanyaan dengan segera. Tetapi jika orang yang diwawancarai dengan benar memahami mekanisme inti C ++ (bagaimana templat bekerja dalam C ++, bagaimana fungsi virtual diimplementasikan, bagaimana kompiler dan penghubung menghasilkan sebuah executable dari kode sumber, dll.), Anda mungkin mendapatkan jawaban dengan langkah-langkah yang sesuai langkah memimpin pertanyaan.

Ditambahkan: Fungsi anggota virtual templat dalam jawaban ini berarti fungsi templat yang merupakan fungsi anggota virtual beberapa kelas - bukan fungsi anggota biasa di kelas templat. Maaf telah membingungkan :(


3
@ Summerlight: Saya mencampur fungsi dan template anggota virtual dan tidak ada hal buruk yang terjadi sejauh ini ... Jadi saya khawatir saya tidak mengerti apa yang Anda maksud. Peduli untuk mencerahkan saya :)?
Matthieu M.

2
Jawaban ini hampir tetapi tidak sepenuhnya benar. Anda tidak dapat memiliki fungsi anggota template virtual, tetapi Anda dapat memiliki fungsi anggota virtual kelas template.
catphive

1
@ Summerlight: ah mengerti! Pertanyaan yang menyenangkan ya, sering muncul;)
Matthieu M.

2
@nikie: Itu adalah fungsi anggota virtual di kelas templat - bukan fungsi anggota templat virtual seperti templat <typename T> virtual void doSomethingWithGenericTypeT (T arg);
musim panas

2
@ summerlight: Anda harus memasukkan contoh itu dalam posting Anda. Saya tidak tahu apa yang Anda maksud sampai sekarang. Pertanyaan yang bagus, sekarang saya mengerti ;-)
nikie

57

Pertanyaan wawancara C ++ terbaik adalah masalah pemrograman, bukan pertanyaan kuis.


Sepakat. Jangan bertanya tentang sintaks yang dapat dicari di Google. Alih-alih, mintalah kandidat menulis fungsi yang mudah (meskipun tidak sepele), lebih disukai sesuatu yang telah Anda tulis dalam kode Anda sendiri pada satu titik.
chrisaycock

4
Bahkan sesuatu yang sederhana seperti "menulis fungsi untuk membalikkan string" dapat memberitahu Anda banyak tentang programmer ahli: apakah mereka menggunakan CString, char*, std::string, dll .; apakah mereka mengembalikan string baru atau mundur di tempat; apakah mereka secara manual mengulangi karakter atau mereka memanggil fungsi perpustakaan. Dan tentu saja jika mereka tidak dapat melakukan sesuatu yang sederhana seperti membalikkan string, itu juga memberi tahu Anda banyak tentang mereka! Ada juga banyak pertanyaan lanjutan, seperti apakah itu bekerja dengan Unicode, apakah itu bekerja dengan UTF-8, dll.
Gabe

16
@Ernelli: C ++ tidak pernah benar-benar berangkat? Serius?
Steven Evers

1
@ Gabe - poin bagus. Misalnya, melakukan templat terbalik di tempat dengan parameter kebijakan mungkin tidak terlalu umum, atau (mungkin kebijakannya bukan fungsi) yang cukup rumit, ketika menyangkut string variabel-byte-per-karakter. Saya tidak tahu apakah tidak ada optimasi-prematur (membuat string baru karena lebih mudah untuk menjadi umum) atau kelincahan (jangan khawatir tentang hal itu sampai terjadi, dan sebaliknya di tempat tidak sulit, mungkin sedikit lebih mudah, untuk string karakter lebar tetap) akan menang.
Steve314

1
@Ernelli - Anda lupa wchar_t dan std :: wstring dan mereka memiliki arti berbeda di Windows / Unix
Martin Beckett

32

Saya akan bertanya kepada mereka apa yang mereka sukai tentang C ++ 0x. Dari sini saya bisa "menyatukan" mereka ke berbagai stereotip:

  • sekolah super tua, menggunakan kompiler C ++ untuk mengkompilasi kode C.
  • sekolah tua, takut (atau melihat tidak ada gunanya) STL, belum mengikuti perubahan
  • mencintai lambdas, mencintai STL semakin cepat dari referensi nilai, penggemar RAII besar, hot untuk menggunakan shared_ptr, unique_ptr dll
  • pahit karena semua kode boost yang ditulis selama beberapa tahun terakhir perlu disesuaikan untuk menggunakan setara C ++ 0x
  • metaprogrammer templat gila yang membuat kepala saya meledak saat menjawab pertanyaan yang relatif singkat

Peluangnya adalah beberapa dari ember ini sangat cocok untuk Anda dan beberapa "terima kasih telah datang". Sebagai pertanyaan yang membuat Anda mendapatkan banyak informasi dengan cepat, ini adalah pemenang saya.


1
+1 untuk pertanyaan utama yang bagus yang mendorong banyak diskusi seputar subjek.
Gary Rowe

8
Anda lupa kategori orang yang tidak tahu apa itu C ++ 0x. Saya kira itu akan lebih merupakan jawaban, dan akan cocok dengan dua jenis pertama.
Fast Fish

1
@Fast Fish, ya, orang yang seperti C ++ 0-whatnow? umumnya akan menjadi salah satu dari dua kategori pertama, dan biasanya akan menerangkan itu dalam jawaban mereka.
Kate Gregory

28

Saya agak heran mengapa "Anda bisa menghapus ini?" dianggap pertanyaan yang menarik. Siapa pun yang telah menulis kode COM dalam C ++ tahu bahwa hal pertama yang Anda pelajari pada hari pertama pemrograman COM dasar adalah bagaimana menggunakan "hapus ini" dengan benar. Saya kira itu mungkin berguna untuk menentukan apakah, katakanlah, seseorang berbohong pada resume mereka tentang telah menulis program COM, tetapi sebagai pengetahuan umum pertanyaan C ++, jika seseorang tidak dapat menjawabnya segera maka mereka tidak akan cocok. untuk tim saya.

Lagi pula, jika tujuan Anda adalah untuk mengajukan pertanyaan yang mengukur keterampilan C ++, maka memilih satu pertanyaan adalah cara yang salah. Putar balik. Pertanyaan yang tepat untuk ditanyakan adalah:

Dalam skala dari satu hingga sepuluh, seberapa bagus seorang programmer C ++?

Ini bukan pertanyaan yang memberi Anda jawaban yang Anda inginkan. Semua orang mengatakan "delapan". Pertanyaan yang memberi Anda jawaban yang Anda inginkan adalah:

OK, jadi Anda delapan. Apa bidang masalah yang menurut Anda tujuh akan mengalami kesulitan bekerja dengan?

Dan boom , sekarang Anda sudah mendapatkannya. Jika kandidat berpikir bahwa "ada hubungannya dengan rekursi" atau "kapan menggunakan destruktor virtual" adalah hal yang sulit dilakukan oleh ketujuh, maka Anda tahu bahwa mereka tahu sedikit tentang rekursi atau destruktor atau apa pun , dan bahwa pengetahuan mereka tidak lebih jauh dari itu.

Itu akan memberi Anda kalibrasi yang jauh lebih baik daripada mengajukan beberapa pertanyaan sepele. Jika Anda memaksa saya untuk mengajukan pertanyaan tunggal yang bagus tentang fakta tentang C ++, saya mungkin akan bertanya seperti "bagaimana Anda mendesain semantic analyzer dan pembuat kode untuk bagian dari kompiler C ++ yang berhubungan dengan metode virtual disebut destruktor kelas dasar? " Anda harus mengajukan pertanyaan yang berkaitan dengan hal-hal nyata yang Anda kerjakan, dan bahwa kandidat kemungkinan akan mengerjakannya. Itu masalah yang harus saya kerjakan sekali, dan saya pikir itu akan memberikan wawasan yang cukup bagus tentang bagaimana seseorang merancang analisis semantik dan generator kode, serta pengetahuan mereka tentang C ++.


3
Saya akan mulai menggunakan ini: OK, jadi Anda delapan. Apa bidang masalah yang menurut Anda tujuh akan mengalami kesulitan bekerja dengan?
David Thielen

10
Pertanyaan bagus lainnya di sini: apa yang bisa dilakukan sembilan orang yang akan membuat Anda kesulitan?
David Thornley

Itu sangat brilian, menakjubkan.
UpAndAdam

14

Hanya untuk bersenang-senang, saya memiliki programmer C ++ yang terhuyung-huyung dengan bayi kecil ini:

Mengapa ini berjalan ke loop tak terbatas (dan ya itu diketik dengan benar)?

int x=0;
while (x<3) {
  x = x++;
}

Sungguh menakjubkan berapa banyak yang tersandung. Tentu saja, saya tidak bisa menggunakannya lagi setelah muncul di Stack Overflow . Bergumam ... bergumam ...

(Untuk mendapatkan jawaban yang tepat baca pengakuan dan baca komentarnya)

Menambahkan pertanyaan bonus

Ada FizzBuzz klasik sepanjang masa (seperti yang ditampilkan dalam artikel Coding Horror yang sekarang terkenal ). Saya tidak pernah benar-benar menggunakannya dalam sebuah wawancara, tetapi setelah membuangnya di sekitar tim pengembangan suatu waktu makan siang hasilnya ... um ... secara mengejutkan akurat.

Pengakuan

Saya terjebak pada respons standar "x ++ mengembalikan nilai asli". Namun, jawaban yang benar adalah bahwa perilaku tidak terdefinisi karena titik urut. Tidak ada yang pernah menyebutkan urutan poin sepanjang waktu saya menggunakan ini sampai saya diposting di sini.

Saya telah dididik dan saya benar-benar ingin berterima kasih kepada semua orang yang telah meluangkan waktu untuk berkomentar.


1
Gary Rowe: Sementara saya suka contoh itu (pertama kali saya melihatnya). Sungguh menyedihkan saya bahwa orang tidak melihat itu dengan cukup cepat, apalagi tidak tahu.
Orbling

2
Ketika saya masih di Microsoft saya mulai meminta pelamar untuk melakukan memasukkan dalam daftar tertaut. Mengapa? Karena sekitar 80% tidak bisa melakukannya. Luar biasa ...
David Thielen

43
Ini belum tentu merupakan loop tak terbatas. Anda memohon perilaku yang tidak terdefinisi di sini (x dimodifikasi dua kali tanpa titik urutan intervensi). Dan pada kenyataannya, dengan kompiler khusus saya, gcc (Debian 4.3.2-1.1) 4.3.2 pada lengkungan khusus saya (x86) itu tidak berakhir.
Logan Capaldo

2
@Logan +1 untuk menyebutkan titik urutan. Anda akan mendapatkan wawancara kedua pasti ;-)
Gary Rowe

4
Ini adalah pertanyaan wawancara yang sangat bagus karena memberi tahu kandidat apakah layak kembali untuk wawancara lain ;-). Jika wawancara benar-benar berpikir bahwa kode tersebut menghasilkan loop tak terbatas (dan pewawancara dianggap kompeten secara teknis) maka kandidat dapat dengan aman memberikan "peluang" kehilangan.
CB Bailey

8

Hal pertama yang harus ditanyakan adalah pertanyaan sederhana tentang petunjuk. Saya heran melihat berapa banyak orang yang mengaku tahu C ++ atau, lebih buruk lagi, C, tidak bisa menjawabnya. Lalu saya akan mengajukan pertanyaan sederhana tentang fungsi virtual. Kombinasi ini memberi tahu Anda dengan sangat cepat apakah orang tersebut benar-benar tahu C ++.


4
tergantung pada latar belakang mereka, tidak pernah bertemu seseorang dengan latar belakang perangkat keras yang tidak mengerti pointer tetapi beberapa yang tidak benar-benar mendapatkan enkapsulasi atau polimorfisme
jk.

7

Itu sangat tergantung pada jenis C ++ yang ditulis di perusahaan Anda. (Ketika saya harus menyewa programmer C ++, saya tidak pernah bertanya delete, karena saya bertanya kepada mereka tentang teknik untuk menghindari harus menulis deletesama sekali.)

Idealnya, Anda ingin merekrut orang yang menulis kode di atas level yang ditulis tim Anda, tetapi tidak terlalu tinggi di atasnya, kecuali jika Anda ingin menggabungkan ini dengan melatih tim untuk membawanya ke tingkat yang lebih tinggi.



6

Saya percaya saya akan bertanya kepada mereka apa lagi yang mereka tahu, atau lebih mungkin memberi mereka pertanyaan dalam sesuatu yang sangat berbeda.

Terlalu banyak C + + coders tentang yang memiliki sedikit pengalaman bahasa lain. Pengalaman sempit biasanya membatasi.


6

Pertanyaan terbaik untuk pengembang C ++ yang hebat adalah "Katakan padaku alasan mengapa kita TIDAK boleh menggunakan C ++?"


4

Saya tidak berpikir ada pertanyaan C ++ terbaik. C ++ adalah bahasa yang begitu besar, dan dengan C ++ 0X itu tumbuh, sehingga Anda bisa menjadi kuat di subdomain tertentu dari bahasa tersebut dan tidak sedikit tentang bagian lain dari bahasa tersebut. Pertanyaan 'one shot' hanya akan melatih pengetahuan seseorang tentang sebagian kecil bahasa dan berisiko mengabaikan pengetahuannya tentang aspek-aspek lain dari bahasa tersebut.



3

Pertanyaan favorit saya adalah sederhana:

a) Apakah Anda mulai dengan C dan kemudian beralih ke C ++?

b) Jika demikian, lalu apa hal pertama yang Anda pelajari untuk dilakukan secara berbeda?

Jawaban ini biasanya memberi saya sedikit tentang bagaimana programmer mendekati C ++ dan pemahamannya tentang OOP dan C ++ secara umum.

tidak ada jawaban "Benar" atau "Salah" di sini, tetapi biasanya ini adalah cara yang bagus untuk mengetahui dari mana kandidat berasal.


1

Saya benar-benar akan memberikan orang itu sedikit kode dari bahasa pemrograman lain yang berorientasi objek dan lebih disukai tidak ada dalam daftar bahasa yang mereka kenal. Kode harus mewakili tugas sederhana yang dilakukan dalam bahasa itu.

Inti dari ini bukan untuk menentukan pengetahuan mereka tentang C ++ tetapi mencari tahu seberapa baik mereka memahami pemrograman. Ketika Anda memahami konsep dasar di balik pemrograman, maka Anda bisa menyelesaikan masalah.


1

Bagaimana Anda menerapkan Fungsi Virtual di C ++, jelaskan skenario dunia nyata.


1

Pada saat ini, saya akan berkata: "Bagaimana Anda akan menerapkan sebuah konstruktor bergerak untuk sebuah wadah?"

Alasan saya adalah bahwa, karena konstruktor pemindahan adalah fitur dari standar berikutnya dan bukan yang sekarang, jawaban kandidat akan menunjukkan apakah pengembang yang bersangkutan aktif mengejar pengetahuan tentang bahasa mereka atau hanya mengikuti trik yang mereka ketahui.


1

Saya pikir saya akan meminta pendapat mereka tentang desain, katakanlah std::string,. Saya juga akan meminta mereka jika mereka telah menggunakan desain lainnya (misalnya, MFC / ATL CString, wxString, dll) dan dengan asumsi mereka memiliki, meminta mereka untuk membandingkan dan kontras desain.

String cukup banyak digunakan sehingga hampir semua orang dengan pengalaman nyata menggunakan C ++ seharusnya menggunakan setidaknya satu atau dua di atas. Hampir semua desain mewujudkan beberapa kompromi antara kemurnian teoretis dan penggunaan praktis. Beberapa dapat bekerja dengan sangat baik, tetapi hanya jika digunakan tepat seperti yang dimaksudkan, sementara yang lain bertukar fleksibilitas yang lebih besar untuk beberapa kecanggungan yang mungkin. Singkatnya, hampir setiap orang yang memiliki pengalaman nyata harus mampu mengekspresikan beberapa pendapat yang bermakna tentang desain mereka dan pendapat itu harus memberi tahu Anda cukup banyak tentang bagaimana mereka berpikir, bagaimana mereka merancang kode, sejauh mana mereka menghargai pragmatisme versus kemurnian teoretis, dan seterusnya.

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.