ホームページ > バックエンド開発 > C#.Net チュートリアル > 理解しておく必要がある厳選された C++ 面接の質問

理解しておく必要がある厳選された C++ 面接の質問

php是最好的语言
リリース: 2018-08-06 16:13:21
オリジナル
2743 人が閲覧しました

C 面接の質問の要点

1.、なぜできないのかコンストラクターは仮想関数として宣言されていますか?

分析: 仮想関数は仮想呼び出しの方法を使用するため、仮想呼び出しとは、

が情報の一部だけを知ることを可能にする動作メカニズムを指します。 . を使用すると、具体的には、インターフェイスのみを認識し、そのオブジェクトの正確な型を認識しない関数を呼び出すことができます。

しかし、コンストラクターを呼び出してオブジェクトを作成したい場合は、オブジェクトの正確な型を知る必要があります。

したがって、コンストラクターを仮想関数にすることはできません。

2.C ## 内のどの関数が仮想関数として宣言できないでしょうか?

分析: 通常の関数 (非メンバー関数)、コンストラクター、インライン メンバー関数、静的メンバー関数、およびフレンド関数。

(1) 仮想関数は基底クラスと派生クラスに使用され、通常の関数は使用できません。

(2) 仮想関数は仮想呼び出しメソッドを使用するため、コンストラクターは使用できません。

(3) インラインメンバー関数の本質は、呼び出しの場所でコードを直接展開することです

(4) 継承する場合、静的メンバー関数は 1 つのクラスにしか属さないため継承できません。は動的リンクではありません

(5) フレンド関数はクラスのメンバー関数ではないため、継承できません

3# # .#クラスの静的メンバーと非静的メンバーの違いは何ですか? 回答: 各クラスには、静的メンバーが 1 つだけあります。静的メンバーは、すべてのクラスのインスタンス オブジェクトによって共有されます。静的メンバーには、静的メンバー変数と静的メンバー関数が含まれます。静的メンバー変数静的メンバー変数には、静的メンバー関数および非静的メンバー関数からアクセスできますが、静的メンバー関数はクラスに属しており、このポインターを持たないため、静的メンバー関数は静的メンバー変数にのみアクセスできます。すべてのオブジェクトには 1 つの非静的メンバーがあります。

4 オーバーロードとオーバーライド (一部の書籍では「オーバーライト」と呼ばれることもあります) の違いは何ですか? オーバーロード: 同じ名前を持つ複数の関数を許可することを指しますが、これらの関数のパラメーター リストは異なります (パラメーターの数が異なるか、パラメーターの型が異なる可能性があります)。異なる、または両方が異なる)。再書き込み: サブクラスが複合クラスの仮想関数を再定義する方法を指します。実装原理から: オーバーロード: コンパイラは、関数の異なるパラメータ リストに基づいて同じ名前の関数の名前を変更し、その後、同じ名前のこれらの関数は (少なくともコンパイラにとっては) 別の関数になります。たとえば、同じ名前の関数が 2 つあります: function func (p: integer): integer; と function func (p: string): integer;。コンパイラによって変更される関数名は次のようになります: int_func、str_func これら 2 つの関数の呼び出しはコンパイラ間で決定され、静的です。言い換えれば、それらのアドレスはコンパイル時にバインドされる (早期バインディング) ため、オーバーロードはポリモーフィズムとは何の関係もありません。書き換え: ポリモーフィズムに非常に関連しています。サブクラスが親クラスの仮想関数を再定義すると、親クラス ポインターは、割り当てられたさまざまなサブクラス ポインターに従って、サブクラスに属する関数を動的に呼び出します。このような関数呼び出しは、コンパイル中に決定できません (呼び出し仮想関数のアドレス)サブクラスの値は指定できません)。したがって、そのような関数アドレスは実行時にバインドされます (遅延バインディング)

5 メンバー関数、グローバル関数、フレンド関数の違いを簡単に説明します。 メンバー関数は、このクラスによってインスタンス化されたオブジェクトによってのみ呼び出すことができます。 [静的メンバーを除く]

グローバル関数はどこからでも呼び出すことができます。

フレンド関数は、このクラスおよびフレンド クラスのオブジェクトから呼び出すことができます。

new で割り当てられたメモリを削除するには、delete を使用します。delete[] を使用して、new[] で割り当てられたメモリを削除します。delete[] は、配列要素のデストラクタを呼び出します。内部データ型にはデストラクターがないため、大きな問題はありません。括弧なしで delete を使用すると、delete は単一のオブジェクトを指していると見なし、そうでない場合は配列を指していると見なします。

#6. 継承のメリットとデメリット。

クラスの継承はコンパイル時に静的に定義され、直接使用できます。クラスの継承により、親クラスの実装をより簡単に変更できます。ただし、クラスの継承にはいくつかの欠点もあります。まず、継承はコンパイル時に定義されるため、親クラスから継承された実装を実行時に変更することはできません。さらに悪いことに、親クラスは通常、子クラスの動作の少なくとも一部を定義しており、親クラスに対する変更は子クラスの動作に影響を与える可能性があります。継承された実装が新しい問題を解決するのに適していない場合は、親クラスを書き直すか、別のより適切なクラスに置き換える必要があります。この依存関係により、柔軟性が制限され、最終的には再利用性が制限されます。 (追加予定)

7. C のプロパティ (オブジェクト指向機能)

カプセル化、継承と複数の状態。

オブジェクト指向プログラミング言語におけるカプセル化は、再利用可能なコンポーネントを使用してソフトウェア システムを構築する機能です。システムの再利用性をサポートするだけでなく、システムのスケーラビリティの向上にも役立ちます。メッセージ パッシングにより、異なるメソッドを呼び出しながら共通のメッセージを送信すること。カプセル化は情報の隠蔽を実現する手法であり、その目的はクラスの定義と実装を分離することです。

#8.「定数参照」を使用する必要があるのはどのような場合ですか?

参照を使用してプログラムの効率を向上させ、関数に渡されたデータが関数内で変更されないように保護する場合は、定数参照を使用する必要があります。定数参照宣言方法:const型識別子 & 参照名 = 対象変数名;

int a

const int &ra=a;

ra=1; //エラー

a=1; //正しい

例 2 string foo();

void bar(string & s);

次に、次の式式は不正になります:

bar(foo( ));

bar("hello world");

理由は、foo() と "hello world" です。 string 一時オブジェクトが生成されます。C では、これらの一時オブジェクトは const 型です。したがって、上記の式は const 型オブジェクトを非 const 型に変換しようとしていますが、これは不正です。 const

9 として定義できる場合は、参照パラメータを const として定義する必要があります。

に使用される ASSERT() とは何ですか

回答: ASSERT() は、プログラムのデバッグ時によく使用されるマクロです。プログラムの実行中に、括弧内の式が評価されます。式が FALSE (0) の場合、

プログラムはエラーになります報告され、実行が終了されます。式が 0 でない場合は、次のステートメントの実行を続けます。このマクロは通常、明らかに不正なデータがプログラム内に存在するかどうかを判断し、存在する場合はプログラムを終了して重大な結果を回避し、エラーの検索を容易にします。たとえば、プログラム内で変数 n を 0 にすることはできません。0 の場合、エラーが発生する可能性があります。

# よりステートフルなメソッドを実現するには? ## 分析: ① 基本クラスへの参照は、その派生クラスのインスタンスを指すことができます。 ② 基本クラスへのポインタは、インスタンスを指すことができますその派生クラス

11.

オブジェクトの 3 つの基本特性-指向でシンプルなナレーションをしますか? ① カプセル化: 目的のものをクラスに抽象化し、各クラスが独自のデータとメソッドにアクセス制御 (プライベート、プロテクト、パブリック) を実装します ②継承: 一般化された継承には 3 つの実装形式があります。 実装継承 (追加のコーディングなしで基本クラスのプロパティとメソッドを使用できる機能を指します) ビジュアル継承 (子フォームは使用します)親フォームの外観と実装コード)

インターフェイスの継承 (プロパティとメソッドのみが使用され、実装はサブクラスの実装に遅れます)。

最初の 2 つ (クラスの継承) と後者 (オブジェクトの組み合わせ => インターフェイスの継承と純粋な仮想関数) は、関数の再利用の 2 つの方法を構成します。

③ ポリモーフィズム: 親オブジェクトを 1 つ以上の子オブジェクトと等しく設定する技術です。割り当て後、親オブジェクトは、現在割り当てられている子オブジェクトの特性に応じてさまざまな方法で動作できます。 。簡単に言うと、「サブクラス型のポインタを親クラス型のポインタに代入することが許可されている」という一文です。

補足質問: ポリモーフィズムの役割は何ですか?

1. コードをモジュール化できるように実装の詳細を非表示にする; コードの再利用を実現するためにコード モジュールを拡張する;

2. インターフェイスの再利用:クラスの場合 継承および派生する場合、ファミリー内のクラスのインスタンスの属性を使用するときに正しい呼び出しが行われるようにしてください。

#12## オーバーロード (オーバーロード) やリライト (オーバーライド) と呼ばれる本もあります ## ################"##################カバー############ ## #”)? ① オーバーロード: 同じ名前の複数の関数の存在が許可され、これらの関数のパラメーター リストが異なることを意味します (パラメーターの数が異なる場合があります)。おそらくパラメータのタイプが異なるか、両方が異なる可能性があります)。 ② 書き換え: サブクラスが親クラスの仮想関数を再定義する方法を指します。 実装原則の観点: ① オーバーロード: コンパイラーは、関数の異なるパラメーター リストに基づいて、同じ名前の関数の名前を変更し、同じ名前のこれらの関数は次のようになります。異なる関数 (少なくともコンパイラに関しては)。このタイプの関数の呼び出しはコンパイル中に決定され、静的です。言い換えれば、それらのアドレスはコンパイル時にバインドされる (早期バインディング) ため、オーバーロードはポリモーフィズムとは何の関係もありません。 ② 書き換え: 本当にポリモーフィズムに関連しています。サブクラスが親クラスの仮想関数を再定義すると、親クラス ポインターは、割り当てられたさまざまなサブクラス ポインターに従って、サブクラスに属する関数を動的に呼び出します。このような関数呼び出しは、コンパイル中に決定できません (呼び出し仮想関数のアドレス)サブクラスの値は指定できません)。したがって、このような関数アドレスは実行時にバインドされます (遅延バインディング) 13

ポリモーフィズムの役割は何ですか?

主なものは 2 つあります:

① コードをモジュール化できるように実装の詳細を非表示にする; コードの再利用を実現するためにコード モジュールを拡張する;

② インターフェースの再利用: クラスが継承および派生するときに、ファミリー内の任意のクラスのインスタンスの特定の属性を使用するときに、正しい呼び出しを保証するため。 14、C の空のクラス、デフォルトのクラス メンバー関数:

class
{
  public:
    Empty();                         // 缺省构造函数
    Empty(const Empty&);             // 拷贝构造函数
    ~Empty();                        // 析构函数
    Empty& operator=(const Empty&);  // 赋值运算符
    Empty* operator&();              // 取值运算符
    const Empty* operator&() const;  // 取值运算符const
};
ログイン後にコピー

15

. プロセス間通信の方法は何ですか?

プロセス間通信方法には、共有メモリ、パイプ (名前付きパイプ/名前なしパイプ)、ソケット、メッセージ キュー、シグナル、セマフォ、メモリ マッピングなどが含まれます。 #16

デッドロックに必要な 4 つの条件? 相互排他的、維持要求、譲渡不可能なループ。

#17

クラスの静的メンバーと非静的メンバーの違いは何ですか? #各クラスには、このクラスに属する静的メンバーが 1 つだけ存在し、クラスの非静的メンバーの各オブジェクトには 1 つのコピーがあります。 18

浅いコピーとは何ですか?ディープコピーとは何ですか?

浅いコピーとは、ソース オブジェクトとコピー オブジェクトがエンティティを共有し、参照される変数のみが異なります (異なる名前) ことを意味します。いずれかのオブジェクトを変更すると、もう一方のオブジェクトにも影響します。 ディープ コピーとは、ソース オブジェクトとコピー オブジェクトが互いに独立しており、一方のオブジェクトに対する変更がもう一方のオブジェクトに影響を与えないことを意味します。

一般的に言えば、浅いコピーとは、そのオブジェクトのポインタをコピーすることです。ディープ コピーはそのオブジェクトをコピーします。

##19##、ウィンドウ#s プログラミング スレッドを同期する方法はいくつかありますか? (重要)

アトミックロック、クリティカルセクション(セグメント)、イベント、ミューテックス(ボディ)、セマフォ、待機可能タイマー

20「見積書」とは何ですか? 「参照」を宣言および使用する際に注意すべき点は何ですか? 回答: 参照はターゲット変数の「エイリアス」(別名) であり、参照の操作は変数を直接操作するのと同じ効果があります。参照を宣言するときは、必ず初期化してください。参照宣言後は、ターゲットの元の名前と参照名の 2 つの名前を持つターゲット変数名と等価になり、参照名を他の変数名のエイリアスとして使用することはできなくなります。参照の宣言は、新しい変数を定義しません。参照名がターゲット変数名のエイリアスであることを意味するだけです。それ自体はデータ型ではないため、参照自体は記憶域ユニットを占有せず、システムが占有します。ストレージユニットを参照に割り当てません。配列への参照を作成できません。

21. 「参照」とポインタの違いは何ですか? #ポインターは、ポインター変数を介してオブジェクトをポイントした後、ポインターがポイントする変数に対して間接的に操作します。プログラム内でポインターを使用すると、プログラムが読みにくくなります。参照自体はターゲット変数の別名であり、参照に対する操作はターゲット変数に対する操作となります。さらに、前述した関数への ref とポインタの受け渡しには違いがあります。

22.関連付け、集約 (Aggregation) と合成 (Composition) の違いは何ですか)? UML のいくつかの概念が含まれています。関連付けは 2 つのクラス間の一般的な接続を表します。たとえば、「学生」と「教師」は関連付け関係であり、集計は「has-a」を表します。関係は比較的緩い関係です。集約クラスが集約クラスを担当する必要はありません。次の図に示すように、集約関係を表すために空のひし形が使用されます。

実装の観点から見ると、集約 これは次のように表現できます:

class A {...} class B { A* a; .....}

そして、組み合わせは contains-a の関係を表します。相関関係は集計より強い : 結合クラスと結合クラスは同じライフサイクルを持ちます。結合クラスは結合クラスを担当します。結合関係を表すために黒のひし形が使用されます:

実装フォームは:

クラス A{ ...} クラス B{ A a; ...}

##23.オブジェクトの 3 つの基本的な特性について、簡単に説明します。 1. カプセル化: 目的のものをクラスに抽象化し、各クラスが独自のデータとメソッドの保護 (プライベート、プロテクト、パブリック) を実装します

2継承: 一般化された継承には 3 つの実装形式があります: 実装継承 (追加のコーディングなしで基本クラスのプロパティとメソッドを使用できる機能を指します)、視覚的継承 (子フォームは親フォームの外観と実装コードを使用します) )、およびインターフェイスの継承 (プロパティとメソッドのみが使用され、実装はサブクラスの実装に遅れます)。最初の 2 つ (クラスの継承) と後者 (オブジェクトの組み合わせ => インターフェイスの継承と純粋仮想関数) は、関数の再利用の 2 つの方法を構成します。

3. ポリモーフィズム: 親オブジェクトを 1 つ以上の子オブジェクトと等しくなるように設定する手法です。代入後、親オブジェクトは、現在の子オブジェクトの特性に応じて異なるように設定できます。割り当てられた操作方法。簡単に言うと、「サブクラス型のポインタを親クラス型のポインタに代入することが許可されている」という一文です。

24 ポリモーフィズムの役割は何ですか? 主なものは 2 つあります: 1. コードをモジュール化できるように実装の詳細を隠す; コードの再利用を実現するためにコード モジュールを拡張する; 2. インターフェイスの再利用: クラスの継承を使用し、派生時に、ファミリー内のクラスのインスタンスの属性を使用するときに正しい呼び出しが行われることを確認します。

25 C コンパイラによってコンパイルされた関数を C 言語で呼び出す必要があるのはなぜですかプログラム? extern "C" ステートメントを追加しますか?

//extern は、関数とグローバル変数のスコープを示す C/C 言語のキーワードです。このキーワードは、宣言された関数と変数がこのモジュールまたは他のモジュールで使用できることをコンパイラに伝えます

// extern "C は接続宣言です。コンパイル時に、次のコードを C スタイルの方法でコンパイルして接続する必要があることをコンパイラーに指示します。目的は、C、C、およびその他の言語の混合プログラミングを実現することです。

26.「参照」と「参照」の違いは何ですか?ポインタ?

ポインタは、ポインタ変数を介してオブジェクトをポイントした後、ポインタが指す変数を間接的に操作します。プログラムが読みにくくなり、参照自体がターゲット変数になります。別名、参照に対する操作はターゲット変数に対する操作です。また、上記の関数に ref とポインタを渡すことの違いでもあります。

23.New delete と malloc free の関係と違い?

回答: どちらもヒープ上で動的メモリ操作を実行します。malloc 関数はメモリ割り当てのバイト数を指定する必要があるため、オブジェクトを初期化できません。new はオブジェクトのコンストラクタを自動的に呼び出します。delete はオブジェクトのデストラクタを呼び出します。 free はオブジェクトのデストラクターを呼び出しません。

24 オーバーロードされたメンバー関数の特徴:
(1) 同じスコープ (同じクラス内);
(2) 関数名が同じ;
(3) パラメータが異なる;
( 4) virtual キーワードはオプションです。

25#上書きとは、派生クラス関数が基底クラス関数の特徴は次のとおりです:
(1) 異なるスコープ (派生クラスと基底クラスにそれぞれ配置);
(2) 関数名は同じ;
(3) パラメータは同じです;
(4) 基本クラス関数には仮想キーワードが必要です。

26## VC を使用してプログラムを開発する場合、C2001、c2005、c2011 などのよくある間違いがいくつかありますが、これらのエラーの原因は何ですか。 #VC の学習過程で発生する LNK2001 エラーのエラー メッセージは主に次のとおりです: 未解決の外部シンボル "シンボル" (未定義の外部 "シンボル")

このエラー メッセージリンカがすべてのライブラリおよびオブジェクト ファイルで参照される関数、変数、またはラベルを見つけることができない場合に生成されます。

一般に、エラーの理由は 2 つあります: 1 つは、参照された関数または変数が存在しないか、スペルが間違っているか、または正しく使用されていないことです。

2 つ目は、接続のバージョンが異なる可能性があります。ライブラリを使用します。

プログラミングでは、定義エラーが繰り返されるという LNK2005 エラーがよく発生します。実際、LNK2005 エラーを解決するのは難しくありません。

27STL を紹介し、STL がベクトルを実装する方法について詳しく説明します。 STL (標準テンプレート ライブラリ) は、コンテナ アルゴリズムの反復子で構成されます。 STL には次の利点があります:

データの検索や並べ替えなどの一連のアルゴリズムを簡単に実装できます;

プログラムのデバッグがより安全かつ便利です;

UNIX プラットフォームで STL を使用している人が書いたコードでも、簡単に理解できます (STL はクロスプラットフォームであるため)。

Vector は本質的に動的配列であり、データの増加に応じて配列スペースを動的に増加させます。

#28

テンプレートとコンテナーを紹介します。どのように達成するか? (その場で実装できる例をあげるかもしれません) ## テンプレートは比較的古いものと言えますが、現在の汎用プログラミングは基本的にテンプレート プログラミングです。

それは普遍的で一般化されたアイデアを具体化しています。

STL には、vector、list、deque、map、multimap、set、multiset の 7 つのメイン コンテナがあります。

29 : ポリモーフィック実装の原理を簡単に説明します。

コンパイラが仮想的な実装があることを検出したときクラス内の関数を使用すると、このクラスの仮想関数テーブル vtable がすぐに生成されます。仮想関数テーブルの各エントリは、対応する仮想関数へのポインタです。また、コンパイラは、ポインタ vptr をこのクラスに暗黙的に挿入します (vc# コンパイラの場合、ポインタは class に挿入されます)。仮想関数テーブルに追加します。このクラスのコンストラクターを呼び出すと、コンパイラーはクラス コンストラクター内の vptrvtable の間の関連付けを暗黙的に実行します。 vptr を対応する vtable にポイントし、クラスをこの vtable# に接続します。 ##クラスから連絡がありました。さらに、クラスのコンストラクターが呼び出されるとき、基本クラスへのポインターは特定のクラスへの this ポインターになり、この ## に依存します。 #thisポインタは正しい vtable を取得できます。この方法でのみ関数本体と真に接続することができ、これが動的バインディングであり、ポリモーフィズムを実現するための基本原理です。

#30: オブジェクト指向についての理解を話してください

分析:

オブジェクト指向は、問題がいくつかの部分で構成されており、各部分が実際にはオブジェクトであることを最初に判断することによって、すべての問題を処理することとして理解できます。次に、これらのオブジェクトを個別に設計し、最終的にプログラム全体を取得します。従来のプログラミングは主に機能的なアイデアに基づいて検討および設計されますが、オブジェクト指向プログラミングはオブジェクトの観点に基づいて問題を検討します。そうすることで、プログラムをより簡潔かつ明確にすることができます。

説明: 最も一般的に使用される

"オブジェクト指向プログラミング テクノロジ "プログラミングで遭遇するのは、オブジェクト指向テクノロジの不可欠な部分です。オブジェクト指向テクノロジを活用することは、オブジェクト指向の分析、設計、プログラミング テクノロジを必要とするだけでなく、必要なモデリング ツールや開発ツールの支援も必要とする包括的な技術課題です。

#31 C でテンプレート クラスを使用する理由。 分析:

1) 動的に増加および減少するデータ構造の作成に使用できます

2) タイプに依存しません。そのため再利用性が高いです。

3) 実行時ではなくコンパイル時にデータ型をチェックし、型の安全性を確保します

4) プラットフォームに依存せず、移植可能です

5) 次の用途に使用できます。基本的なデータ型

##32 関数テンプレートとクラス テンプレートの違いは何ですか? #回答: 関数テンプレートのインスタンス化は、関数呼び出しの処理時にコンパイラによって自動的に完了しますが、クラス テンプレートのインスタンス化は

#プログラマがプログラム内で明示的に指定する必要があります。

33. Winsock 接続を実現するための主な手順は何ですか? (非常に重要なので必ず確認してください)

答え: サーバー側: socker()

ソケットを確立し、バインド (bind) してリッスン (listen)、accept() を使用

クライアント接続を待機しています。

クライアント: socker()ソケットを確立し、サーバーに接続します (connect ) 、接続後、 send()recv (

) を使用して、次のように記述しますデータ交換が完了するまでソケット上のデータを読み取ります。closesocket()ソケットを閉じます。

サーバー側: accept() はクライアント接続を見つけ、新しいソケットを確立し、接続の待機を再開します# ########キャッチ。新しく生成されたソケットは、

send() および recv() を使用して、データ交換が完了するまでデータの書き込みと読み取りを行います (##)。 #closesock et()

ソケットを閉じます。

#34 プロセスとスレッドの違い。

回答: スレッドはプロセス内の実行ユニットを指し、プロセス内でスケジュール可能なエンティティでもあります。プロセスとの違い: ( 1) スケジューリング: スレッドはスケジューリングと割り当ての基本単位であり、プロセスはリソース所有権の基本単位です

(2) 同時実行性: プロセスを同時に実行できるだけでなく、同じプロセスの複数のスレッドを実行できます。

(3) 独自のリソース: プロセスはリソースを所有する独立した単位です。スレッドはシステム リソースを所有しませんが、プロセスに属するリソースにアクセスできます。

(4) システム オーバーヘッド: プロセスの作成時またはキャンセル時に、システムはプロセスにリソースを割り当てて再利用する必要があるため、システム オーバーヘッドはスレッドの作成時またはキャンセル時のオーバーヘッドよりも大幅に大きくなります。

35. C はタイプセーフですか?

答え: いいえ。異なる型の 2 つのポインタをキャストできます (

再解釈キャストを使用)

#C# はタイプ セーフです。

#VC を使用してプログラムを開発すると、C2001、c2005、c2011 などの一般的なエラーが発生します。その理由は何ですか?これらのエラー。
  1. #37 マクロとインライン関数の違い

分析: インライン関数とマクロは両方とも、プログラムが表示される場所で展開されます。インライン関数は、関数呼び出しを通じて実装されません。それらは、関数を呼び出すプログラムで展開されます (コンパイル中に完了します)。マクロも ;違いは、インライン関数はコンパイル中に型検出やステートメントが正しいかどうかなどのコンパイル機能を完了できるのに対し、マクロにはそのような機能がなく、マクロの展開時間はインライン関数のそれとは異なります (実行時に展開)

#38 win32 のメッセージ ループ Windows プログラムのエントリ ポイントはどこですか? Windows メッセージ機構の処理を書く

# 分析: Windows プログラムのエントリ ポイントは WinMain() 関数です。 Windows アプリケーションのメッセージ処理メカニズム: #A. オペレーティング システムは、アプリケーションのウィンドウ メッセージを受信し、そのメッセージをアプリケーションのメッセージ キューに配信します。B. アプリケーション プログラムメッセージ ループで GetMessage 関数を呼び出して、メッセージ キューからメッセージを 1 つずつ取得します。メッセージを取得した後、アプリケーションはメッセージに対して前処理を実行できます。

C. アプリケーションは DispatchMessage を呼び出して、オペレーティング システムにメッセージを送り返します。

D. システムは、WNDCLASS 構造体の lpfnWndProc メンバーに保存されているウィンドウ プロシージャ関数へのポインターを使用して、メッセージを処理するウィンドウ プロシージャを呼び出します。

#39: プログラミング仕様についての理解または知識について話す

プログラミング仕様は次のように要約できます: プログラムの実現可能性、読みやすさ、移植性、テストのしやすさ。

注: これはプログラミング仕様の概要です。面接官は上記の例を暗唱する必要はありません。これらの例で示されている問題を理解し、実現可能性と可読性、移植性の問題をどのように解決できるかを考える必要があります。とテストのしやすさを上記の例と通常のプログラミング習慣と組み合わせて、この質問に答えます。

40 ストリーム演算子のオーバーロードが参照を返す理由

#プログラムでは、ストリーム演算子 >> と < ;<連続して使用されることが多い。したがって、これら 2 つの演算子の戻り値は、これら 2 つの演算子を引き続きサポートするストリーム参照である必要があります。他のデータ型ではこれを行うことはできません。

注: 代入演算子とストリーム演算子を除き、、、-、*、/ などの他の演算子は参照を返してはなりません。これら 4 つの演算子のオブジェクトはすべて右辺値であるため、戻り値としてオブジェクトを構築する必要があります。

41 親クラスが仮想関数を記述するというのは本当ですか? サブクラスが仮想関数を追加せずにその関数をオーバーライドする場合、ポリモーフィズムは達成できますか?

virtual 修飾子は暗黙的に継承されます。 private も統合されていますが、派生クラスにはアクセス権がありません。仮想は追加することも追加しないこともできます。サブクラスの空間には、親クラスのすべての変数 (静的変数を除く) が含まれます。同じ関数にはエンティティが 1 つだけあります (インラインを除く)。サブクラスは、virtual を追加せずに関数をオーバーライドすることでポリモーフィズムを実現することもできます。サブクラスの空間には、親クラスのプライベート変数が存在します。プライベート変数には直接アクセスできません。

42. C と C の違いは何ですか?

機械的に: c はプロセス指向です (ただし、 c はオブジェクト指向プログラムも作成できます); c はオブジェクト指向であり、クラスを提供します。ただし、c は c よりもオブジェクト指向プログラムを書きやすいです。

該当する方向から: c は、組み込みなど、コード サイズが小さく、効率性が必要な場合に適しており、より高レベルで複雑な場合には c が適しています。プログラム; llinux コア システム ソフトウェアであり、非常に高い効率が要求されるため、そのほとんどは C で書かれています。

名前からも、c よりも c の数が多いことがわかります。これは、c が c のスーパーセットであることを意味します。では、なぜ c ではなく c と呼ばれるのでしょうか? c が # より大きいためです。

##c 拡張子が多すぎると言うので、c の後に 2 つ入れたら c になりました

##C 言語は構造化プログラミング言語で、C はオブジェクト指向プログラミング言語です。

C は、プロセスではなくオブジェクト、ロジック設計ではなくクラス設計に重点を置いています。

#43 プリプロセッサ フラグ #error の目的は何ですか?
答えがわからない場合は、参考資料 1 を参照してください。この質問は、普通の男性とオタクを区別するのに役立ちます。このような質問に対する答えを見つけるために C 言語の教科書の付録を読むのはオタクだけです。もちろん、オタクを探しているわけではない場合、候補者は答えを知らないことを望んだほうがよいでしょう。

#44. 次の 2 つの for ループの長所と短所を簡単に説明してください

//最初の
for (i=0; i ;){if (条件)DoSomething();else DoOtherthing();}
/ / Second
if (条件){for (i=0; i ;)DoSomething();}
else{for (i=0; i ;) DoOtherthing();}
##空白と多肢選択式の質問を埋めてください:

1. 次の演算子のうち、オーバーロードできないものはどれですか?

( )A. スコープ演算子 "::"B. オブジェクト メンバー演算子 "."

C . ポインタ メンバー演算子"->"

D. 三項演算子 "? :"

分析: ABD が機能しない理由はありません

2.

以下の C クラスの説明で、間違っているのは

A.C 言語で導入されたクラスは、主にデータのカプセル化メカニズムとして、および型定義メカニズムとして 2 つの役割を果たします。 B.C クラスで定義されたデータと関数は、それぞれデータメンバーとメンバー関数と呼ばれます

データのカプセル化メカニズムとして、C.C クラスはデータとそのデータに対する操作を整理して、情報の隠蔽を実現します。

D.C クラスのメンバーは、パブリック メンバー、保護されたメンバー、およびprivate メンバーと友達

正解:D

3。 int x = 123 の場合、ステートメントは "123" という形式の出力を生成します ("" はスペースを表します)。

## A.cout << setw (8) << showpos << x << endl;

B. cout << setw (8) << showpos << Internal << x << endl;

C.cout << setw (8) << ; showpos << left << x << endl;

D.cout << showpos << Internal << x << endl;

正解: B

##4#. クラス テンプレートの宣言ステートメントでは、正しいのは## A.template class Sample {…}; B.template class Sample {…} ;

C.template class Sample {…};

D.template Sample {…};

正解: C

5

C 以外の組み込み型 A と B、どのような状況で B が可能か暗黙的に A? に変換されます。 [C Medium] a. クラス B : public A { ……}b. クラス B { 演算子 A( ); }c. クラス A { A ( const B& ); }
d. A& 演算子= ( const A& );

分析: 最初の項目 B は A からパブリックに継承され、間接的に継承できます。 2 番目の項目: B は、A

への暗黙的な変換を実装します。 3 番目の項目: A は、非明示的なパラメータを B として実装します (デフォルト値を持つ他のパラメータを持つことができます) コンストラクタ

4 つの項目: 代入操作。これは本物の暗黙的な型変換ではありませんが、それでも 1 つとしてみなされる可能性があります


#6

このポインタに関する間違った記述は (A)

  1. ##このポインタには説明が表示されなければなりません

    1. ##メンバー関数にはこのポインターがあります このポインターを所有する

    2. #7.

    3. 次の関数プロトタイプ宣言では、(B) fun を純粋仮想関数として宣言しています
    4. A . void fun()=0;
    5. ##B 仮想 void fun()=0;

      C 仮想 void fun();
    6. D virtual void fun(){};

8

フレンド オペレータobj>obj2 は、C コンパイラによって (A) として解釈されます。

## 演算子>(obj1,obj2)

# >(obj1,obj2)# obj2.operator>( obj1)

## obj1.oprator>(obj2)
  1. # #

9.假定AB为一个类,则执行“AB a(4),b[3],*p[2];”语句时,自动调用该类构造函数的次数为:B

A) 3 B) 4 C) 6 D) 9

10.假定要对类AB定义加号操作符重载成员函数,实现两个AB类对象的加法,并返回相加结果,则该成员函数的声明语句为:B

A) AB operator+(AB &a,AB &b)

B) AB operator+(AB &a)

C) operator+(AB a)

D) AB & operator+()

11.有二维字符数组char s[4][6]={"zhang","gao","tang","wang"};执行程序cout<<*s[2],屏幕上显示:D

A)gao B)tang C)g D)t

12 #include打印结果是多少

 using namespace std;
   class A1{
   public:
    int a;
    static int b;
    A1();
    ~A1();
   };
   int main()   {
    cout << sizeof(A1) <<endl;
   }
ログイン後にコピー

         解析:是4, 静态变量是存放在全局数据区的, 而sizeof是计算局部栈中分配的大小。

13.死锁的处理

  解析:鸵鸟策略、预防策略、避免策略、检测与解除死锁,只要知道概念就行,不需要掌握

14. 非C++内建型别 A 和 B,在哪几种情况下B能隐式转化为A?[C++中等]

解析:a. class B : public A { ……} // B公有继承自A,可以是间接继承的

     b. class B { operator A( ); } // B实现了隐式转化为A的转化

    c. class A { A( const B& ); } // A实现non-explicit的参数为B(可有其他带默认值的参数)构造函数

    d. A& operator= ( const A& ); // 赋值操作,虽不是正宗的隐式类型转换,但也可以勉强算一个

15以下代码有什么问题?[STL易]

typedef vector IntArray;

IntArray array;

array.push_back( 1 );

array.push_back( 2 );

array.push_back( 2 );

array.push_back( 3 );

// 删除array数组中所有的2

for( IntArray::iterator itor=array.begin(); itor!=array.end(); ++itor )

{

    if( 2 == *itor ) array.erase( itor );

}

    解析:其实里面隐藏着一个很严重的错误:当veci.erase(iter)之后,iter就变成了一个野指针,对一个野指针进行 iter++ 是肯定会出错的。

16 下列代码的输出值是多少?

class A{};

class A1{};

class B : public A{};

class C : public A, public A1{};

class D : public virtual A{};

cout << sizeof ( A ) << endl;

cout << sizeof ( B ) << endl;

cout << sizeof ( C ) << endl;

cout << sizeof ( D ) << endl;

分析: 回答: 1 , 1, 1, 4 説明: 空のクラスが占める空間は 1 であり、単一継承の空のクラス空間も 1 であり、多重継承の空のクラス空間も 1 のままですが、仮想継承には仮想テーブル (仮想ポインタ) が含まれます。 ) なので、サイズは 4 です。

関連記事:

基本的な C# 面接の 125 の質問と回答を共有

面接の質問 1、面接の質問

以上が理解しておく必要がある厳選された C++ 面接の質問の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート