最高のC ++インタビューの質問は何ですか?[閉まっている]


28

C ++プログラマーにC ++スキルを測定するために1つの質問をすることができたら、それは何でしょうか?

私が一番いいと思う質問は、「これを削除してください」と呼ぶことができますか?メンバー関数内?(最初によく考えてから、これをリンクとして配置してから、ベストC ++インタビューの質問-今までに行って正しい答えを確認してください。)

ほとんどの人が答えを知っていると思うので、私はこれを尋ねません。もし彼らがそうすれば、それほど有用な質問ではないでしょう。私は、彼らが正しい答えに向かって進むことができるかどうか、そしてどのようにそれをするかを尋ねます。

回答:


8

仮想メンバー関数をC ++のテンプレートで使用できない理由について質問します。もちろん、実際にすぐに質問に答えることができる人はほとんどいません。ただし、インタビュー対象者がC ++のコアメカニズム(C ++でのテンプレートの動作方法、仮想関数の実装方法、コンパイラーとリンカーがソースコードから実行可能ファイルを生成する方法など)を適切に理解している場合、適切なステップバイバイで答えを得ることができます。ステップの主要な質問。

追加:この回答のテンプレート仮想メンバー関数は、テンプレートクラスの通常のメンバー関数ではなく、あるクラスの仮想メンバー関数であるテンプレート関数を意味します。混乱してすみません:(


3
@summerlight:バーチャルメンバ関数とテンプレートを混在させていますが、これまでのところ何も悪いことはありませんでした。だから、あなたが何を得ているのか理解できませんでした。私を啓発することに注意してください:)?
マチューM.

2
この答えはほとんど正しいですが、まったく正しくありません。テンプレート仮想メンバー関数は使用できませんが、テンプレートクラスの仮想メンバー関数は使用できます。
catphive

1
@summerlight:ああ、わかった!面白い質問はい、しばしばポップアップします;)
マチューM.

2
@nikie:これはテンプレートクラスの仮想メンバー関数です。template<typename T> virtual void doSomethingWithGenericTypeT(T arg)のような仮想テンプレートメンバー関数ではありません。
夏の光

2
@summerlight:投稿にその例を含めるべきでした。今まであなたが何を意味していたのか分かりませんでした。良い質問ですが、今は理解できたので
;

57

最高のC ++インタビューの質問は、クイズの質問ではなく、プログラミングの問題です。


同意した。Googleで検索できる構文について質問しないでください。代わりに、候補者に簡単な(些細なことではありませんが)関数、できれば独自のコードで一度に書いたものを書いてもらいます。
chrisaycock

4
「文字列を逆にする関数を書く」などの簡単なようであっても何かがあなたに専門家のプログラマについて多くのことを伝えることができます:彼らが使うのですかCStringchar*std::string、など。新しい文字列を返すか、元の位置に逆変換しますか?文字を手動でループするか、ライブラリ関数を呼び出しますか。そしてもちろん、彼らが文字列を逆にするような単純なことをできないなら、それはまたあなたについて多くを教えてくれます!また、Unicodeで機能するか、UTF-8で機能するかなど
Gabe

16
@Ernelli:C ++は実際に離陸したことはありませんか?マジ?
スティーブンエバーズ

1
@Gabe-良い点。たとえば、ポリシーパラメータを使用してインプレースリバーステンプレートを実行することは、文字ごとの可変バイト文字列に関しては、あまり一般的ではないか、(おそらく関数ではなくポリシー)非常に複雑です。no-premature-optimisation(新しい文字列を作成する方が一般的であるため)または敏ility性(発生するまでそのケースを心配しないで、インプレースリバースはそれほど難しくないか、多分少し簡単で、固定幅の文字列の場合)勝ちます。
Steve314

1
@Ernelli -あなたはwchar_t型とstd :: wstringのを忘れているし、それらは、Windows / Unix上で異なることを意味
マーティン・ベケット

32

私は彼らにC ++ 0xについて何が好きか尋ねます。これから、それらをさまざまなステレオタイプに「バケツ」できました。

  • 超オールドスクール、C ++コンパイラを使用してCコードをコンパイル
  • STLが怖い(または意味がない)古い学校は、変更に追いついていない
  • ラムダが大好き、右辺値参照から高速化するSTLが大好き、大きなRAIIファン、shared_ptr、unique_ptrなどを使用するのがホット
  • 過去数年間に書かれたすべてのブーストコードをC ++ 0xの同等物を使用するように適応させる必要があるため
  • 比較的短い質問に答えながら頭を爆発させる非常識なテンプレートメタプログラマ

これらのバケットのいくつかはあなたにぴったりであり、いくつかは「入ってくれてありがとう」です。多くの情報を迅速に入手できる質問として、これが私の勝者です。


1
主題に関する多くの議論を促進する良い先導的な質問に対して+1。
ゲイリーロウ

8
C ++ 0xが何であるかを知らない人々のカテゴリーを忘れました。私はそれが答えの多くであり、最初の2つのタイプに合うと思います。
高速魚

1
@Fast Fish、はい、C ++ 0-whatnowのような人ですか?一般的に最初の2つのカテゴリの1つであり、通常は回答でそれを明らかにします。
ケイトグレゴリー

28

なぜ「これを削除できますか?」興味深い質問であると考えられています。C ++でCOMコードを書いた人は誰でも、基本的なCOMプログラミングの初日に学ぶ最初のことは、「これを正しく削除する」方法を知っていることです。例えば、誰かがCOMプログラムを書いたことについて履歴書に横たわっているかどうかを判断するのに役立つかもしれませんが、一般的な知識のC ++の質問として、誰かがすぐに答えることができなければ、うまく適合しないでしょう私のチームのために。

とにかく、あなたの目標がC ++スキルを測定する質問を考え出すことである場合、1つの質問を選ぶのは間違った方法です。それを好転させる。適切な質問は次のとおりです。

1から10の規模で、あなたはC ++プログラマーとしてどれくらい優れていますか?

これは、あなたが望む答えを得る質問ではありません。とにかく誰もが「8」と言います。あなたが望む答えを得る質問は次のとおりです。

OK、あなたは8歳で​​す。セブンが一緒に仕事をするのに苦労すると思う問題領域は何ですか?

そしてブーム、あなたはそれらを手に入れました。候補者が「再帰と関係がある」または「仮想デストラクタを使用するとき」が7に苦労しているようなものであると考えている場合、再帰またはデストラクタなどについて少し知っていることがわかります。 、そして彼らの知識はそれよりもはるかに遠くまで行かないこと。

これにより、トリビアの質問をするよりもはるかに優れたキャリブレーションが得られます。C ++の事実に関する良い質問を1つだけ出すように強制する場合、「仮想メソッドを処理するC ++コンパイラの部分のセマンティックアナライザーとコードジェネレーターをどのように設計しますか?」基本クラスのデストラクタで呼び出されますか?」あなたが取り組んでいる実際のものに関係している質問をする必要があり、候補者はおそらく作業するでしょう。それは私が一度取り組む必要があった問題であり、人がセマンティックアナライザーとコードジェネレーターを設計する方法とC ++の知識についてかなり良い洞察を与えると思います。


3
私はこれを使い始めます:OK、あなたは8歳で​​す。セブンが一緒に仕事をするのに苦労すると思う問題領域は何ですか?
デヴィッドティーレン

10
ここで別の良い質問:あなたが問題を抱えているナインは何をすることができますか?
デビッドソーンリー

それはとても素晴らしいことです。
UpAndAdam

14

ちょっとした楽しみのために、私はC ++プログラマーにこの小さな赤ちゃんを巻き込んでもらいました。

なぜこれが無限ループに陥るのですか(そして、はい、正しく入力されています)?

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

何人がつまずいたかは驚くべきことです。もちろん、Stack Overflowに表示されたは使用できません。つぶやき...つぶやき...

(適切な答えを得るには、告白を読んで、間違いなくコメントを読んでください)

ボーナス質問を追加しました

これまでに有名なFizzBu​​zzがあります(今では有名なCoding Horrorの記事で紹介されています)。私は実際にインタビューで実際に使用したことはありませんが、ある昼食時に開発チームの周りにそれをチャックした後、結果は...ええと...驚くほど正確でした。

告白

標準の「x ++が元の値を返す」という応答に追いつきました。ただし、正しい答えは、シーケンスポイントのために動作が未定義であるということです。ここに投稿するまで、これを使用したすべての時間で誰もシーケンスポイントに言及しませんでした。

私は教育を受けており、コメントに時間を割いてくれたすべての人に本当に感謝したいと思います。


1
ゲイリー・ロウ:その例を愛していますが(初めて見ました)。知らないことは言うまでもなく、人々がそれをかなり早く見ないのは悲しいことです。
オーブリング

2
マイクロソフトにいたとき、私は応募者にリンクリストへの挿入を依頼し始めました。どうして?約80%ができなかったからです。アメージング...
デヴィッドThielen

43
これは必ずしも無限ループではありません。ここでは、未定義の動作を呼び出しています(xは、介在するシーケンスポイントなしで2回変更されます)。そして実際、私の特定のコンパイラ、gcc(Debian 4.3.2-1.1)4.3.2では、特定のarch(x86)で終了ます。
ローガンカパルド

2
シーケンスポイントに言及するための@Logan +1。確かに2回目のインタビューを受けるでしょう;-)
ゲイリーロウ

4
これは、候補者に別のインタビューに戻る価値があるかどうかを伝えるので、本当に良いインタビューの質問です;-)。コードが無限ループを引き起こすとインタビューが本当に考えている場合(およびインタビュアーは技術的に有能であると想定されている場合)、候補者は安全に「機会」を逃すことができます。
CBベイリー

8

最初に尋ねるのは、ポインターに関する簡単な質問です。C ++、さらに悪いことにCを知っていると主張する多くの人が答えられないことに驚いた。次に、仮想関数について簡単な質問をします。この組み合わせにより、その人が実際にC ++を知っているかどうかがすぐにわかります。


4
バックグラウンドに依存し、ポインターを理解していないが、カプセル化やポリモーフィズムを実際に取得していないハードウェアのバックグラウンドを持つ人に会うことはありません
jk。

7

それはあなたの会社でどんな種類のC ++が書かれているかに大きく依存します。(C ++プログラマーを雇わなければならなかったとき、私はまったく質問deleteすることを避けるためのテクニックについて彼らに尋ねたので、私は決して尋ねなかったdelete。)

理想的には、あなたのチームが現在書いているレベル以上のコードを書く人を雇いたいが、それを上回ってはいけません。これをチームのトレーニングと組み合わせてより高いレベルに引き上げたいのでなければ。



6

私は彼らに彼らが知っている他のことを尋ねるか、または彼らに全く異なる何かで質問をする可能性が高いと信じています。

他の言語の経験がほとんどないC ++コーダーが多すぎます。狭い経験は通常制限されます。


6

優れたC ++開発者にとって最良の質問は、「C ++を使用しない理由を教えてください」です。


4

最高のC ++の質問があるとは思わない。C ++は非常に大きな言語であり、C ++ 0Xでは成長しているため、言語の特定のサブドメインに強いことができ、言語の別の部分についても少なからず学ぶことができます。「1回限りの」質問では、誰かが言語のごく一部について知識を行使するだけで、言語の他の側面についての彼または彼女の知識を見落とす危険があります。


4

3

私が尋ねるお気に入りの質問は簡単です。

a)Cで始めてからC ++に切り替えましたか?

b)そうだとすれば、異なる方法で学んだ最初のいくつかのことは何でしたか?

この答えは通常、プログラマーがC ++にどのようにアプローチし、一般的にOOPとC ++を把握しているかについてのビーズを与えてくれます。

ここには「正しい」または「間違った」答えはありませんが、通常は候補者がどこから来たのかを知るのに最適な方法です。


1

私は実際に、オブジェクト指向であり、できれば彼らが知っている言語のリストに載っていない別のプログラミング言語のコードを少し見せます。コードは、その言語で実行される単純なタスクを表す必要があります。

この点は、C ++の知識を決定することではなく、プログラミングをどれだけ理解しているかを見つけることです。プログラミングの背後にある基本概念を理解すると、問題を解決できます。


1

C ++で仮想関数を実装するには、実際のシナリオを説明してください。


1

現時点では、「コンテナの移動コンストラクタをどのように実装しますか?」と言います。

私の論理的根拠は、移動コンストラクタは現在の標準ではなく次の標準の機能であるため、候補者の答えは、問題の開発者が言語に関する知識を積極的に追求するのか、単に知っているトリックにこだわるのかを示すということです。


1

私は、例えば、のデザインについて彼らの意見を尋ねると思うstd::string。私はまた、彼らは他のデザインを使用している場合(例えば、MFC / ATLをそれらを求めるだろうCStringwxStringなど、)と彼らが持っていると仮定すると、デザインを比較対照してもらいます。

文字列は十分に広く使用されているため、C ++を実際に使用した経験のある人は、少なくとも1つまたは2つを使用する必要があります。ほぼすべての設計は、理論上の純度と実際の使用との間のいくつかの妥協を体現しています。本当にうまく機能するものもありますが、意図したとおりに使用した場合に限られますが、他のいくつかは不器用な可能性をより多くの用途に利用できます。要するに、実際の経験を持っている人なら誰でも、自分のデザインについて有意義な意見を述べることができるはずであり、それらの意見は、彼らがどのように考えるかコードをどのようデザインするか、彼らがプラグマティズムと理論的純度のどちらを重視するか、等々。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.