top 70 c interview questions
入門レベルの候補者および経験豊富な専門家向けのコード例を含む、最もよくある基本および高度なC ++面接の質問:
この詳細な記事は、C ++インタビューの準備をしている人のためのブックマークになるはずです。
ここでは、C ++のほとんどすべての主要なトピックと、標準テンプレートライブラリ(STL)などの高度なトピックに関するいくつかの基本的な質問について説明します。
この一連のC ++コーディングの質問は、C ++の面接に自信を持って向き合い、最初の試行で問題なくクリアするのに役立ちます。
学習内容:
コード例を使用したC ++インタビューの質問
以下に、C ++の専門家が回答する最も人気のあるC ++プログラミングの面接の質問を示します。
また読む=> トップCプログラミング面接の質問
基本的なC ++
C ++プログラムの構造
Q#1)C ++プログラムの基本構造は何ですか?
回答: C ++プログラムの基本構造を以下に示します。
#include int main() { cout<<”Hello,World!”; return 0; }
「」で始まる最初の行 # 」は プリプロセッサディレクティブ 。この場合、使用しています 含める コンパイラにヘッダーを含めるように指示するディレクティブとして iostream.h 」は、プログラムの後半で基本的な入出力に使用されます。
次の行は、整数を返す「main」関数です。主な機能は、C ++プログラムの実行の開始点です。ソースコードファイル内の位置に関係なく、main関数の内容は常にC ++コンパイラによって最初に実行されます。
次の行では、コードのブロックの開始を示す中括弧が開いています。この後、標準出力ストリームであるカウントを使用するプログラミング命令またはコード行が表示されます(その定義はiostream.hにあります)。
この出力ストリームは文字列を受け取り、それを標準出力デバイスに出力します。この場合は、「Hello、World!」です。各C ++命令はセミコロン(;)で終わることに注意してください。これは非常に必要であり、これを省略するとコンパイルエラーが発生します。
中括弧を閉じる前に}、別の行「return0;」が表示されます。これがmain関数への戻り点です。
すべてのC ++プログラムは、上記のような基本構造を持ち、プリプロセッサディレクティブ、メイン関数宣言、コードブロック、およびプログラムの正常な実行を示すメイン関数へのリターンポイントが続きます。
Q#2)C ++のコメントは何ですか?
回答: C ++のコメントは、コンパイラによって無視されるソースコードの一部にすぎません。これらは、プログラマーがソースコードに関する説明や追加情報を追加する場合にのみ役立ちます。
C ++では、コメントを追加する方法が2つあります。
- //単一行コメント
- / *コメントをブロックする* /
最初のタイプは、コンパイラが「//」を検出した後、すべてを破棄します。 2番目のタイプでは、コンパイラーは「/ *」と「* /」の間のすべてを破棄します。
変数、データ型、および定数
Q#3)変数の宣言と定義の違い。
回答: 変数の宣言は、変数のデータ型と変数名を指定するだけです。宣言の結果として、指定されたデータ型に従ってメモリ内の変数用のスペースを予約するようにコンパイラに指示します。
例:
int Result; char c; int a,b,c;
上記はすべて有効な宣言です。また、宣言の結果、変数の値は未定であることに注意してください。
一方、定義は宣言された変数の実装/インスタンス化であり、適切な値を宣言された変数に結び付けて、リンカーが参照を適切なエンティティにリンクできるようにします。
上記の例から 、
結果= 10;
C =「A」;
これらは有効な定義です。
Q#4)変数のローカルスコープとグローバルスコープについてコメントしてください。
回答: 変数のスコープは、変数がアクティブなままであるプログラムコードの範囲として定義されます。つまり、変数を宣言、定義、または操作できます。
C ++には2つのタイプのスコープがあります。
- ローカルスコープ: 変数はローカルスコープを持っていると言われるか、コードブロック内で宣言されたときにローカルです。変数はブロック内でのみアクティブのままであり、コードブロック外ではアクセスできません。
- グローバルスコープ: 変数は、プログラム全体でアクセスできる場合、グローバルスコープを持ちます。グローバル変数は、すべての関数定義の前にプログラムの上で宣言されます。
例:
#include Int globalResult=0; //global variable int main() { Int localVar = 10; //local variable. ….. }
Q#5)プログラムに同じ名前のグローバル変数とローカル変数がある場合の優先順位は何ですか?
回答: グローバル変数と同じ名前のローカル変数がある場合は常に、コンパイラーがローカル変数を優先します。
例:
#include int globalVar = 2; int main() { int globalVar = 5; cout<上記のコードの出力は5です。これは、両方の変数の名前が同じであるにもかかわらず、コンパイラーがローカルスコープを優先しているためです。
Q#6)同じ名前のグローバル変数とローカル変数がある場合、どのようにグローバル変数にアクセスしますか?
回答: 名前は同じでスコープが異なる2つの変数がある場合、つまり1つがローカル変数で、もう1つがグローバル変数である場合、コンパイラはローカル変数を優先します。
グローバル変数にアクセスするために、「 スコープ解決演算子(::) 」。この演算子を使用して、グローバル変数の値にアクセスできます。
例:
#include int x= 10; int main() { int x= 2; cout<<”Global Variable x = “<<::x; cout<<”
local Variable x= “< 出力:
グローバル変数x = 10
ローカル変数x = 2
Q#7)定数でintを初期化する方法はいくつありますか?
回答: 2つの方法があります:
- 最初の形式は、従来のC表記を使用します。
int結果= 10; - 2番目の形式は、コンストラクター表記を使用します。
int結果(10);
定数
Q#8)定数とは何ですか?例を挙げて説明します。
回答: 定数は、固定値を持つ式です。それらは、データ型に応じて、整数、10進数、浮動小数点、文字、または文字列定数に分割できます。
10進数とは別に、C ++はさらに2つの定数、つまり8進数(基数8)と16進数(基数16)の定数もサポートします。
定数の例:
- 75 //整数(10進数)
- 0113 //オクタル
- 0x4b // 16進数
- 3.142 //浮動小数点
- ‘c’ //文字定数
- 「Hello、World」//文字列定数
注意: 単一の文字を表す必要がある場合は一重引用符を使用し、複数の文字で定数を定義する場合は二重引用符を使用します。
Q#9)C ++で定数をどのように定義/宣言しますか?
回答: C ++では、を使用して独自の定数を定義できます。 #define プリプロセッサディレクティブ。
#define識別子の値
例:
#include #define PI 3.142 int main () { float radius =5, area; area = PI * r * r; cout<<”Area of a Circle = “< 出力: 円の面積= 78.55
上記の例に示すように、#defineディレクティブを使用して定数を定義すると、プログラム全体でそれを使用して、その値を置き換えることができます。
「」を使用してC ++で定数を宣言できます。 const 」キーワード。この方法は、変数を宣言する方法と似ていますが、接頭辞constが付いています。
定数の宣言例
const int pi = 3.142;
const char c =“ sth”;
const zipcode = 411014;
上記の例では、定数の型が指定されていない場合、C ++コンパイラはデフォルトで整数型に設定します。
演算子
Q#10)C ++の代入演算子についてのコメント。
回答: C ++の代入演算子は、別の変数に値を代入するために使用されます。
a = 5;
このコード行は整数値を割り当てます 5 変数に に 。
=演算子の左側の部分はとして知られています 左辺値 (左の値)と右の 右辺値 (正しい値)。 L 値 常に変数である必要がありますが、右側は定数、変数、操作の結果、またはそれらの任意の組み合わせにすることができます。
割り当て操作は常に右から左に行われ、その逆は行われません。
C ++が他のプログラミング言語に対して持っている1つの特性は、代入演算子をとして使用できることです。 右辺値 (またはの一部 右辺値 )別の割り当て。
例:
a = 2 +(b = 5);
と同等です:
b = 5;
a = 2 + b;
つまり、最初に割り当てます 5 変数に b 次にに割り当てます に、 値 二 プラス前の式の結果 b (つまり5)、葉 に 最終値は 7 。
したがって、次の式はC ++でも有効です。
a = b = c = 5;
変数に5を割り当てます に 、 b そして c 。
Q#11)等しい(==)と代入演算子(=)の違いは何ですか?
回答: C ++では、equal(==)と代入演算子(=)は2つの完全に異なる演算子です。
Equal to(==)は、2つの式を評価してそれらが等しいかどうかを確認し、等しい場合はtrueを返し、等しくない場合はfalseを返す等式関係演算子です。
代入演算子(=)は、変数に値を代入するために使用されます。したがって、評価のために等式関係演算子内で複雑な代入演算を行うことができます。
Q#12)C ++のさまざまな算術演算子は何ですか?
回答:C ++は、次の算術演算子をサポートしています。
- +追加
- –減算
- *乗算
- /除算
- %モジュール
次のコードを使用して、さまざまな算術演算子を示しましょう。
例:
#include int main () { int a=5, b=3; cout<<”a + b = “< 出力 :
a + b = 8
a – b = 2
a * b = 15
a / b = 2
a%b = 1
上に示したように、他のすべての演算は単純で、実際の算術演算と同じですが、モジュロ演算子はまったく異なります。モジュロ演算子はaとbを除算し、演算の結果は除算の余りです。
Q#13)C ++のさまざまな複合代入演算子は何ですか?
回答: 以下は、C ++の複合割り当て演算子です。
+ =、-=、* =、/ =、%=、>> =、<<=, &=, ^=,|=
複合割り当て演算子は、C ++言語の最も重要な機能の1つであり、基本的な演算子の1つを使用して変数の値を変更できます。
例:
value += increase; is equivalent to value = value + increase; if base_salary is a variable of type int. int base_salary = 1000; base_salary += 1000; #base_salary = base_salary + 1000 base_salary *= 5; #base_salary = base_salary * 5;
Q#14)プリインクリメント/デクリメント操作の違いを述べてください。
回答: C ++では、++(インクリメント)と–(デクリメント)の2つの演算子を使用できます。これらの演算子を使用すると、変数の既存の値に1を加算し、変数から1を減算できます。これらの演算子は、インクリメント(++)およびデクリメント(–)と呼ばれます。
例:
a = 5;
++;
2番目のステートメントa ++により、aの値に1が追加されます。したがって、a ++はと同等です
a = a + 1;または
a + = 1;
これらの演算子のユニークな機能は、これらの演算子に変数の接頭辞または接尾辞を付けることができることです。したがって、aが変数であり、インクリメント演算子の前に付けると、次のようになります。
++ a;
これはプリインクリメントと呼ばれます。同様に、事前デクリメントもあります。
変数aの前にインクリメント演算子を付けると、次のようになります。
++;
これはポストインクリメントです。同様に、ポストデクリメントもあります。
preとpostの意味の違いは、式の評価方法と結果の保存方法によって異なります。
事前インクリメント/デクリメント演算子の場合、インクリメント/デクリメント演算が最初に実行され、次に結果が左辺値に渡されます。一方、ポストインクリメント/デクリメント操作の場合、左辺値が最初に評価され、次にインクリメント/デクリメントが実行されます。
例:
a = 5; b = 6;
++ a; #a = 6
b–; #b = 6
–a; #a = 5
b ++; #6
コンソールを介したI / O
Q#15)C ++の抽出演算子と挿入演算子とは何ですか?例を挙げて説明します。
回答: C ++のiostream.hライブラリでは、 中国 、および 費用 は、それぞれ入力と出力に使用される2つのデータストリームです。 Coutは通常画面に向けられ、cinはキーボードに割り当てられます。
「cin」(抽出演算子): オーバーロードされた演算子>>をcinストリームで使用することにより、C ++は標準入力を処理します。
int age; cin>>age;
上記の例に示すように、整数変数「age」が宣言され、cin(キーボード)がデータを入力するのを待ちます。 「cin」は、RETURNキーが押された場合にのみ入力を処理します。
「cout」(挿入演算子): これは、オーバーロードされたものと組み合わせて使用されます<< operator. It directs the data that followed it into the cout stream.
例:
SQLサーバーは答えで例を照会します
cout<<”Hello, World!”; cout<<123;
制御構造と機能
制御構造とループ
Q#16)whileループとdo whileループの違いは何ですか?例を挙げて説明します。
回答: C ++のwhileループの形式は次のとおりです。
一方(表現)
{ステートメント;}
whileの下のステートメントブロックは、指定された式の条件が真である限り実行されます。
POSにiPadを使用する
例:
#include int main() { int n; cout<>n; while(n>0) { cout<<” “<上記のコードでは、nが0の場合、ループは直接終了します。したがって、whileループでは、終了条件はループの先頭にあり、それが満たされると、ループの反復は実行されません。
次に、do-whileループについて考えます。
do-whileの一般的な形式は次のとおりです。
{ステートメント;} while(条件);を実行します。
例:
#include int main() { int n; cout<>n; do { cout<上記のコードでは、ループ条件が終了しているため、ループ内のステートメントが少なくとも1回実行されていることがわかります。これらは、whileとdo-whileの主な違いです。
whileループの場合、条件が満たされない場合は、最初にループを直接終了できますが、do-whileループでは、ループステートメントを少なくとも1回実行します。
機能
Q#17)「void」の戻り値の型とはどういう意味ですか?
回答: すべての関数は、一般的な構文に従って値を返す必要があります。
ただし、関数が値を返さないようにする場合は、「 ボイド 」を示します。これは、「 ボイド 」は、関数に戻り値がないか、「」を返すことを示します。 ボイド 」。
例:
void myfunc() { Cout<<”Hello,This is my function!!”; } int main() { myfunc(); return 0; }
Q#18)値渡しと参照渡しについて説明してください。
回答: 「値渡し」を使用してパラメーターを関数に渡すときに、パラメーターのコピーを関数に渡します。
したがって、呼び出された関数のパラメーターに加えられた変更は、呼び出し元の関数に戻されません。したがって、呼び出し元の関数の変数は変更されません。
例:
void printFunc(int a,int b,int c) { a *=2; b *=2; c *=2; } int main() { int x = 1,y=3,z=4; printFunc(x,y,z); cout<<”x = “< 出力:
x = 1
y = 3
z = 4
上記のように、呼び出された関数でパラメーターが変更されましたが、値が渡されたため、それらの値は呼び出し元の関数に反映されませんでした。
ただし、変更された値を関数から呼び出し元の関数に戻したい場合は、「参照渡し」手法を使用します。
これを実証するために、上記のプログラムを次のように変更します。
void printFunc(int& a,int& b,int& c) { a *=2; b *=2; c *=2; } int main() { int x = 1,y=3,z=4; printFunc(x,y,z); cout<<”x = “< 出力:
x = 2
y = 6
z = 8
上に示したように、「参照渡し」手法を使用すると、呼び出された関数のパラメーターに加えられた変更が呼び出し元の関数に渡されます。これは、この手法を使用してパラメータのコピーを渡すのではなく、実際には変数の参照自体を渡すためです。
Q#19)デフォルトパラメータとは何ですか?それらはC ++関数でどのように評価されますか?
回答: デフォルトパラメータは、関数の宣言時に各パラメータに割り当てられる値です。
この値は、関数の呼び出し中にそのパラメーターが空白のままになっている場合に使用されます。特定のパラメーターのデフォルト値を指定するには、関数宣言のパラメーターに値を割り当てるだけです。
関数呼び出し中にこのパラメーターに値が渡されない場合、コンパイラーは指定されたデフォルト値を使用します。値が指定されている場合、このデフォルト値が踏まれ、渡された値が使用されます。
例:
int multiply(int a, int b=2) { int r; r = a * b; return r; } int main() { Cout< 出力:
12
6
上記のコードに示されているように、multiply関数には2つの呼び出しがあります。最初の呼び出しでは、1つのパラメーターのみが値とともに渡されます。この場合、2番目のパラメーターは提供されたデフォルト値です。ただし、2番目の呼び出しでは、両方のパラメーター値が渡されるため、デフォルト値がオーバーライドされ、渡された値が使用されます。
Q#20)C ++のインライン関数とは何ですか?
回答: インライン関数は、関数を呼び出すポイントとしてコンパイラーによってコンパイルされ、その時点でコードが置換される関数です。これにより、コンパイルが高速になります。この関数は、関数プロトタイプの前にキーワード「inline」を付けることで定義されます。
このような関数は、インライン関数のコードが小さくて単純な場合にのみ有利です。関数はインラインとして定義されていますが、インラインとして評価するかどうかはコンパイラに完全に依存しています。
高度なデータ構造
配列
Q#21)配列が通常forループで処理されるのはなぜですか?
回答: 配列は、インデックスを使用して各要素をトラバースします。
Aが配列の場合、その各要素はA (i)としてアクセスされます。プログラム的に、これが機能するために必要なのは、0からA.length-1に増分するインデックス(カウンター)として機能するループ変数iを持つ反復ブロックです。
これはまさにループが行うことであり、これがforループを使用して配列を処理する理由です。
Q#22) deleteとdelete ()の違いを説明します。
回答: 「delete ()」は、new ()を使用して割り当てられたアレイに割り当てられたメモリを解放するために使用されます。 「削除」は、newを使用して割り当てられたメモリの1つのチャンクを解放するために使用されます。
Q#23)このコードの何が問題になっていますか?
T * p =新しいT (10);
pを削除します。
回答: 上記のコードは構文的に正しく、正常にコンパイルされます。
唯一の問題は、配列の最初の要素を削除するだけであるということです。配列全体が削除されますが、最初の要素のデストラクタのみが呼び出され、最初の要素のメモリが解放されます。
Q#24)配列内のオブジェクトが破棄される順序は何ですか?
回答: 配列内のオブジェクトは、構築の逆の順序で破棄されます。最初に構築され、最後に破棄されます。
次の例では、 デストラクタの順序は、a (9)、a (8)、…、a (1)、a (0)になります。
voiduserCode() { Car a(10); ... }
ポインタ
Q#25)このコードの何が問題になっていますか?
T * p = 0;
pを削除します。
回答: 上記のコードでは、ポインターはnullポインターです。 C ++ 03標準によれば、NULLポインタでdeleteを呼び出すことは完全に有効です。削除演算子は、内部でNULLチェックを処理します。
Q#26)C ++の参照変数とは何ですか?
回答: 参照変数は、既存の変数のエイリアス名です。これは、変数名と参照変数の両方が同じメモリ位置を指していることを意味します。したがって、変数が更新されるたびに、参照も更新されます。
例:
int a=10; int& b = a;
ここで、bはaの参照です。
ストレージクラス
Q#27)ストレージクラスとは何ですか? C ++のストレージクラスに言及します。
回答: ストレージクラスは、変数や関数などのシンボルの寿命または範囲を決定します。
C ++は、次のストレージクラスをサポートしています。
- 自動
- 静的
- 外部
- 登録
- 可変
Q#28)可変ストレージクラス指定子について説明してください。
回答: 定数クラスオブジェクトのメンバーの変数は変更できません。ただし、変数を「可変」として宣言することにより、これらの変数の値を変更できます。
Q#29)autoのキーワードは何ですか?
回答: デフォルトでは、関数のすべてのローカル変数は自動です。 自動 。以下の関数では、変数「i」と「j」の両方が自動変数です。
void f() { int i; auto int j; }
注意 :グローバル変数は自動変数ではありません。
Q#30)静的変数とは何ですか?
回答: 静的変数は、関数呼び出し全体でその値を保持するローカル変数です。静的変数は、キーワード「static」を使用して宣言されます。静的な数値変数のデフォルト値はゼロです。
次の関数は、3回呼び出された場合、1 23を出力します。
void f() { static int i; ++i; printf(“%d “,i); }
グローバル変数が静的である場合、その可視性は同じソースコードに制限されます。
Q#31)Extern Storage Specifierの目的は何ですか?
回答: 「extern」指定子は、グローバルシンボルのスコープを解決するために使用されます。
#include using nam espace std; main() { extern int i; cout< 上記のコードでは、「i」はそれが定義されているファイルの外側に表示されます。
Q#32)レジスタストレージ指定子について説明してください。
回答: 「登録」変数は、変数を使用するときは常に使用する必要があります。変数が「レジスタ」指定子で宣言されると、コンパイラはそのストレージ用のCPUレジスタを提供して、変数のルックアップを高速化します。
Q#33)関数で「const」参照引数を使用するのはいつですか?
回答: 関数で「const」参照引数を使用すると、いくつかの点でメリットがあります。
- 「const」は、データを変更する可能性のあるプログラミングエラーから保護します。
- 「const」を使用した結果、関数はconstとnon-constの両方の実際の引数を処理できます。これは、「const」を使用しない場合は実行できません。
- const参照を使用すると、関数は適切な方法で一時変数を生成して使用できます。
構造とユーザー定義のデータ型
Q#34)クラスとは何ですか?
回答: クラスは、C ++のユーザー定義データ型です。特定の種類の問題を解決するために作成できます。作成後、ユーザーはクラスの動作の詳細を知る必要はありません。
一般に、クラスはプロジェクトの青写真として機能し、さまざまなパラメーターや関数、またはこれらのパラメーターを操作するアクションに含めることができます。これらはクラスのメンバーと呼ばれます。
Q#35)クラスと構造の違い。
回答:
構造: C言語では、この構造体を使用して、さまざまなタイプのデータ型をバンドルします。構造内の変数は、構造のメンバーと呼ばれます。これらのメンバーはデフォルトでパブリックであり、構造名、ドット演算子、メンバー名の順に使用してアクセスできます。
クラス: クラスは構造の後継です。 C ++は、構造体定義を拡張して、そのメンバーを操作する関数を含めます。デフォルトでは、クラス内のすべてのメンバーはプライベートです。
C ++を使用したオブジェクト指向プログラミング
クラス、コンストラクタ、デストラクタ
Q#36)名前空間とは何ですか?
回答: 名前空間を使用すると、グローバルクラス、オブジェクト、関数のセットを特定の名前でグループ化できます。
名前空間を使用する一般的な形式は次のとおりです。
名前空間識別子{名前空間-本体}
ここで、identifierは任意の有効な識別子であり、namespace-bodyは、名前空間に含まれるクラス、オブジェクト、および関数のセットです。名前空間は、複数のオブジェクトが同じ名前を持ち、名前が衝突する可能性がある場合に特に役立ちます。
Q#37)「using」宣言の用途は何ですか?
回答: 宣言の使用は、スコープ解決演算子なしで名前空間から名前を参照するために使用されます。
Q#38)名前マングリングとは何ですか?
回答: C ++コンパイラは、関数/メソッドを使用してパラメータタイプを一意の名前にエンコードします。このプロセスは名前マングリングと呼ばれます。逆のプロセスは、デマングリングと呼ばれます。
例:
A :: b(int、long) constは次のようにマングルされます ‘b__C3Ail’ 。
コンストラクターの場合、メソッド名は省略されます。
あれは A :: A(int、long) constは次のようにマングルされます 「C3Ail」。
Q#39)オブジェクトとクラスの違いは何ですか?
回答: クラスは、解決すべきプロジェクトまたは問題の青写真であり、変数とメソッドで構成されます。これらはクラスのメンバーと呼ばれます。静的に宣言されていない限り、クラスのメソッドまたは変数に単独でアクセスすることはできません。
クラスメンバーにアクセスして使用するには、オブジェクトと呼ばれるクラスのインスタンスを作成する必要があります。クラスの有効期間は無制限ですが、オブジェクトの有効期間は限られています。
Q#40)C ++のさまざまなアクセス指定子は何ですか?
回答: C ++は、次のアクセス指定子をサポートしています。
- 公衆: データメンバーと関数は、クラスの外部からアクセスできます。
- 民間: クラス外ではデータメンバーと関数にアクセスできません。例外は、フレンドクラスの使用です。
- 保護: データメンバーと関数には、派生クラスのみがアクセスできます。
例:
PRIVATE、PROTECTED、およびPUBLICをそれらの違いとともに説明し、例を示します。
class A{ int x; int y; public int a; protected bool flag; public A() : x(0) , y(0) {} //default (no argument) constructor }; main(){ A MyObj; MyObj.x = 5; // Compiler will issue a ERROR as x is private int x = MyObj.x; // Compiler will issue a compile ERROR MyObj.x is private MyObj.a = 10; // no problem; a is public member int col = MyObj.a; // no problem MyObj.flag = true; // Compiler will issue a ERROR; protected values are read only bool isFlag = MyObj.flag; // no problem
Q#41)コンストラクターとは何ですか?どのように呼ばれますか?
回答: コンストラクターは、クラスと同じ名前のクラスのメンバー関数です。これは主にクラスのメンバーを初期化するために使用されます。デフォルトでは、コンストラクターはパブリックです。
コンストラクターを呼び出す方法は2つあります。
- 暗黙的に: コンストラクターは、クラスのオブジェクトが作成されるときにコンパイラーによって暗黙的に呼び出されます。これにより、スタック上にオブジェクトが作成されます。
- 明示的な呼び出し: newを使用してクラスのオブジェクトを作成すると、コンストラクターが明示的に呼び出されます。これは通常、ヒープ上にオブジェクトを作成します。
例:
class A{ int x; int y; public A() : x(0) , y(0) {} //default (no argument) constructor }; main() { A Myobj; // Implicit Constructor call. In order to allocate memory on stack, //the default constructor is implicitly called. A * pPoint = new A(); // Explicit Constructor call. In order to allocate //memory on HEAP we call the default constructor. }
Q#42)COPY CONSTRUCTORとは何ですか?いつ呼び出されますか?
回答: コピーコンストラクターは、パラメーターと同じクラスのオブジェクトを受け入れ、そのデータメンバーを割り当ての左側のオブジェクトにコピーするコンストラクターです。同じクラスの新しいオブジェクトを作成する必要がある場合に便利です。
例:
class A{ int x; int y; public int color; public A() : x(0) , y(0) {} //default (no argument) constructor public A( const A& ) ; }; A::A( const A & p ) { this->x = p.x; this->y = p.y; this->color = p.color; } main() { A Myobj; Myobj.color = 345; A Anotherobj = A( Myobj ); // now Anotherobj has color = 345 }
Q#43)デフォルトコンストラクタとは何ですか?
回答: デフォルトのコンストラクターは、引数がないか、引数がある場合はすべてデフォルトのコンストラクターです。
例:
class B { public: B (int m = 0) : n (m) {} int n; }; int main(int argc, char *argv()) { B b; return 0; }
Q#44)変換コンストラクターとは何ですか?
回答: これは、異なるタイプの1つの引数を受け入れるコンストラクターです。変換コンストラクターは、主に1つの型から別の型に変換するために使用されます。
Q#45)明示的コンストラクターとは何ですか?
回答: 変換コンストラクターは、明示的なキーワードで宣言されます。コンパイラーは、明示的なコンストラクターを使用して、型の暗黙的な変換を実装しません。その目的は、構築のために明示的に予約されています。
Q#46)クラスメンバー変数のStaticキーワードの役割は何ですか?
回答: 静的メンバー変数は、それぞれのクラス用に作成されたすべてのオブジェクト間で共通のメモリを共有します。オブジェクトを使用して静的メンバー変数を参照する必要はありません。ただし、クラス名自体を使用してアクセスできます。
Q#47)静的メンバー関数について説明してください。
回答: 静的メンバー関数は、クラスの静的メンバー変数にのみアクセスできます。静的メンバー変数と同様に、静的メンバー関数にもクラス名を使用してアクセスできます。
Q#48)ローカルオブジェクトが破棄される順序は何ですか?
回答:次のコードを検討してください。
Class A{ …. }; int main() { A a; A b; ... }
main関数では、2つのオブジェクトが次々に作成されます。それらは、最初にa、次にbの順に作成されます。ただし、これらのオブジェクトが削除された場合、またはスコープ外になると、それぞれのデストラクタは、作成されたのとは逆の順序で呼び出されます。
したがって、bのデストラクタが最初に呼び出され、次にaが呼び出されます。オブジェクトの配列がある場合でも、作成の逆の順序で同じ方法で破棄されます。
オーバーロード
Q#49)関数のオーバーロードと演算子のオーバーロードについて説明してください。
回答: C ++は、「多くの形式」を意味するOOPの概念であるポリモーフィズムをサポートしています。
C ++には、コンパイル時ポリモーフィズムと実行時ポリモーフィズムの2種類のポリモーフィズムがあります。コンパイル時のポリモーフィズムは、オーバーロード手法を使用して実現されます。オーバーロードとは、基本的な意味をそのまま維持することにより、エンティティに追加の意味を与えることを意味します。
C ++は、次の2種類のオーバーロードをサポートしています。
関数のオーバーロード:
関数のオーバーロードは、プログラマーが同じ名前でパラメーターリストが異なる複数の関数を持つことを可能にする手法です。言い換えると、引数のタイプ、引数の数、引数の順序など、さまざまな引数で関数をオーバーロードします。
関数のオーバーロードは、その戻り値の型では決して達成されません。
演算子のオーバーロード:
これは、C ++でサポートされているコンパイル時のポリモーフィズムのさらに別のタイプです。演算子のオーバーロードでは、演算子がオーバーロードされるため、標準データ型のオペランドを使用してユーザー定義型も操作できます。ただし、これを実行している間、その演算子の標準定義はそのまま維持されます。
例えば、 数値データ型を操作する加算演算子(+)は、複素数クラスのオブジェクトと同じように、2つのオブジェクトを操作するようにオーバーロードできます。
Q#50)C ++でのメソッドのオーバーロードとメソッドのオーバーライドの違いは何ですか?
回答: メソッドのオーバーロードとは、同じ名前で引数リストが異なる関数を使用することです。これは、コンパイル時のポリモーフィズムの一形態です。
基本クラスから派生したメソッドを書き直すと、メソッドのオーバーライドが明らかになります。メソッドのオーバーライドは、実行時のポリモーフィズムまたは仮想関数を処理するときに使用されます。
Q#51)コピーコンストラクタとオーバーロードの違いは何ですか 代入演算子?
回答: コピーコンストラクタとオーバーロードされた代入演算子は、基本的に同じ目的を果たします。つまり、あるオブジェクトのコンテンツを別のオブジェクトに割り当てます。しかし、それでも、2つの間に違いがあります。
例:
complex c1,c2; c1=c2; //this is assignment complex c3=c2; //copy constructor
上記の例では、2番目のステートメントc1 = c2はオーバーロードされた代入ステートメントです。
ここで、c1とc2は両方とも既存のオブジェクトであり、c2の内容はオブジェクトc1に割り当てられます。したがって、オーバーロードされた代入ステートメントの場合、両方のオブジェクトがすでに作成されている必要があります。
次のステートメント、complex c3 = c2は、コピーコンストラクターの例です。ここで、c2の内容は新しいオブジェクトc3に割り当てられます。つまり、コピーコンストラクターは実行するたびに新しいオブジェクトを作成します。
Q#52)オーバーロードできない演算子に名前を付けます。
回答:
- sizeof –sizeof演算子
- 。 –ドット演算子
- 。* –間接参照演算子
- -> –メンバーの間接参照演算子
- :: –スコープ解決演算子
- ?:–条件演算子
Q#53)値または参照であるパラメーターに基づいて、関数がオーバーロードされる可能性があります。ステートメントが正しいかどうかを説明します。
回答: 誤り。値による受け渡しと参照による受け渡しはどちらも、呼び出し元と同じように見えます。
Q#54)演算子のオーバーロードの利点は何ですか?
回答: クラスの標準演算子をオーバーロードすることで、これらの演算子の意味を拡張して、他のユーザー定義オブジェクトでも操作できるようにすることができます。
関数のオーバーロードにより、コードの複雑さを軽減し、引数リストが異なる同じ関数名を使用できるため、コードがより明確で読みやすくなります。
継承
Q#55)継承とは何ですか?
回答: 継承とは、既存のエンティティの特性を取得し、それに機能を追加することで新しいエンティティを形成できるプロセスです。
C ++に関しては、継承とは、既存のクラスから派生した新しいクラスを作成することです。これにより、この新しいクラスは、独自のクラスだけでなく親クラスのプロパティも持つようになります。
Q#56)継承の利点は何ですか?
回答: 継承によりコードの再利用が可能になり、コード開発の時間を節約できます。
継承することで、バグのない高品質のソフトウェアを利用して、将来の問題を軽減します。
Q#57)C ++は多重レベルおよび多重継承をサポートしていますか?
回答: はい。
Q#58)多重継承(仮想継承)とは何ですか?その長所と短所は何ですか?
回答: 多重継承では、派生クラスが継承できる基本クラスが複数あります。したがって、派生クラスは、複数の基本クラスの機能とプロパティを取ります。
例えば 、クラス 運転者 つまり、2つの基本クラスがあります。 社員 ドライバーは人であると同時に従業員でもあるからです。これは、ドライバークラスが個人クラスだけでなく従業員のプロパティも継承できるため、有利です。
ただし、従業員と個人の場合、クラスにはいくつかの共通のプロパティがあります。ただし、ドライバークラスは、共通のプロパティを継承するクラスを認識しないため、あいまいな状況が発生します。これは、多重継承の主な欠点です。
Q#59)ISAとHASAのクラスの関係について説明してください。どのように実装しますか 各?
回答: 「ISA」関係は通常、別のクラスのクラス「ISA」専用バージョンを意味するため、継承を示します。 例えば 、 従業員のISA担当者。つまり、EmployeeクラスはPersonクラスから継承されます。
「ISA」とは異なり、「HASA」の関係は、エンティティがそのメンバーとして別のエンティティを持っているか、クラスに別のオブジェクトが埋め込まれている可能性があることを示しています。
したがって、Employeeクラスの同じ例をとると、Salaryクラスを従業員に関連付ける方法は、それを継承するのではなく、Employeeクラス内にSalaryオブジェクトを含めるか含めることです。 「HASA」の関係は、封じ込めまたは集約によって最もよく示されます。
Q#60)派生クラスは継承しますか、それとも継承しませんか?
回答: 派生クラスが特定の基本クラスから構築される場合、基本的にすべての機能と基本クラスの通常のメンバーを継承します。ただし、この規則にはいくつかの例外があります。たとえば、派生クラスは基本クラスのコンストラクタとデストラクタを継承しません。
各クラスには、独自のコンストラクタとデストラクタがあります。派生クラスは、基本クラスおよびクラスのフレンドの代入演算子も継承しません。その理由は、これらのエンティティは特定のクラスに固有であり、別のクラスが派生している場合、またはそれがそのクラスのフレンドである場合、それらを渡すことができないためです。
ポリモーフィズム
Q#61)ポリモーフィズムとは何ですか?
回答: ポリモーフィズムの背後にある基本的な考え方は、さまざまな形であります。 C ++には、次の2種類のポリモーフィズムがあります。
(i)コンパイル時のポリモーフィズム
コンパイル時のポリモーフィズムでは、オーバーロードによって多くの形式を実現します。したがって、演算子のオーバーロードと関数のオーバーロードがあります。 (これについてはすでに説明しました)
(ii)ランタイムポリモーフィズム
これは、クラスとオブジェクトのポリモーフィズムです。一般的な考え方は、基本クラスは複数のクラスに継承できるというものです。基本クラスポインタはその子クラスを指すことができ、基本クラス配列はさまざまな子クラスオブジェクトを格納できます。
これは、オブジェクトが同じ関数呼び出しに対して異なる反応をすることを意味します。このタイプのポリモーフィズムは、仮想関数メカニズムを使用できます。
Q#62)仮想関数とは何ですか?
回答: 仮想関数を使用すると、派生クラスを基本クラスによって提供される実装に置き換えることができます。
基本クラスと派生クラスに同じ名前の関数がある場合は常に、基本クラスポインターを使用して子クラスオブジェクトにアクセスしようとすると、あいまいさが生じます。基本クラスポインタを使用しているため、呼び出される関数は同じ名前の基本クラス関数です。
このあいまいさを修正するために、基本クラスの関数プロトタイプの前にキーワード「virtual」を使用します。言い換えれば、このポリモーフィック関数を仮想にします。仮想関数を使用することで、あいまいさを取り除き、基本クラスのポインターを使用してすべての子クラス関数に正しくアクセスできます。
Q#63)ランタイムポリモーフィズム/仮想関数の例を挙げてください。
回答:
class SHAPE{ public virtual Draw() = 0; //abstract class with a pure virtual method }; class CIRCLE: public SHAPE{ public int r; public Draw() { this->drawCircle(0,0,r); } }; class SQUARE: public SHAPE{ public int a; public Draw() { this->drawSquare(0,0,a,a); } }; int main() { SHAPE shape1*; SHAPE shape2*; CIRCLE c1; SQUARE s1; shape1 = &c1; shape2 = &s1; cout上記のコードでは、SHAPEクラスは純粋仮想関数を持ち、抽象クラスです(インスタンス化できません)。各クラスは、独自の方法でDraw()関数を実装するSHAPEから派生しています。
さらに、各Draw関数は仮想であるため、派生クラス(CircleおよびSQUARE)のオブジェクトで毎回基本クラス(SHAPE)ポインターを使用すると、適切なDraw関数が呼び出されます。
Q#64)純粋仮想関数とはどういう意味ですか?
回答: 純粋仮想メンバー関数は、基本クラスが派生クラスを強制的にオーバーライドするメンバー関数です。通常、このメンバー関数には実装がありません。純粋仮想関数はゼロと同等です。
例:
class Shape { public: virtual void draw() = 0; };
純粋仮想関数をメンバーとする基本クラスは、「抽象クラス」と呼ぶことができます。このクラスはインスタンス化できず、通常、さらに実装されたいくつかのサブクラスを持つブループリントとして機能します。
Q#65)仮想コンストラクタ/デストラクタとは何ですか?
回答:
仮想デストラクタ: 派生クラスオブジェクトを指す基本クラスポインタを使用してそれを破棄すると、派生クラスデストラクタを呼び出す代わりに、基本クラスデストラクタが呼び出されます。
例:
Class A{ …. ~A(); }; Class B:publicA{ … ~B(); }; B b; A a = &b; delete a;
上記の例に示すように、delete aと言うと、デストラクタが呼び出されますが、実際には基本クラスのデストラクタです。これにより、bが保持するすべてのメモリが適切にクリアされないというあいまいさが生じます。
この問題は、「仮想デストラクタ」の概念を使用することで解決できます。
基本クラスコンストラクタを「仮想」にして、すべての子クラスデストラクタも仮想になるようにします。派生クラスのオブジェクトを指す基本クラスのオブジェクトを削除すると、適切なデストラクタが呼び出され、すべてが呼び出されます。オブジェクトは適切に削除されます。
これは次のように表示されます。
ネットワークトラブルシューティング面接の質問と回答pdf
Class A{ …. virtual ~A(); }; Class B:publicA{ … ~B(); }; B b; A a = &b; delete a;
仮想ビルダー :コンストラクターを仮想にすることはできません。コンストラクターを仮想関数として宣言すると、構文エラーになります。
友達
Q#66)フレンド機能とは何ですか?
回答: C ++クラスでは、プライベートメンバーと保護されたメンバーにクラスの外部からアクセスすることはできません。しかし、このルールは、「 友達 ' 関数。
名前自体が示すように、フレンド関数はクラスのフレンドである外部関数です。フレンド関数がクラスのプライベートメソッドと保護されたメソッドにアクセスするには、クラス内にキーワード「friend」が含まれているフレンド関数のプロトタイプが必要です。
Q#67)フレンドクラスとは何ですか?
回答: フレンドクラスは、プライベートアクセス指定子と保護されたアクセス指定子のルールをオーバーライドして、2つのクラスが互いに緊密に連携できるようにする必要がある場合に使用されます。
したがって、友達クラスを別のクラスの友達にすることができます。このようにして、フレンドクラスは、アクセスできないプライベートなものをそのまま維持できます。
公開して詳細を公開せずにクラス(プライベートメンバー)の内部実装にアクセスする必要がある場合は、フレンド関数を使用します。
高度なC ++
テンプレート
Q#68)テンプレートとは何ですか?
回答: テンプレートを使用すると、データ型(汎用)に依存しない関数を作成でき、可能なすべてのデータ型で関数をオーバーロードすることなく、任意のデータ型をパラメーターおよび戻り値として受け取ることができます。テンプレートは、マクロの機能をほぼ満たしています。
そのプロトタイプは次のいずれかです。
テンプレート 識別する >> function_declaration;
テンプレート 識別する >> function_declaration;
両方のプロトタイプの唯一の違いは、キーワードクラスまたはタイプ名の使用です。ジェネリックであるというそれらの基本的な機能は同じままです。
例外処理
Q#69)例外処理とは何ですか? C ++は例外処理をサポートしていますか?
回答: はいC ++は例外処理をサポートしています。
コードが常に正常に実行されることを保証することはできません。エラーがない場合でも、Googleが作成したコードが誤動作する可能性がある特定の状況が発生する可能性があります。このコードの誤動作は、 例外 。
例外が発生した場合、コンパイラは例外が発生したことを認識できるようにそれをスローする必要があります。例外がスローされた場合、コンパイラーは、プログラムフローが適切に続行または終了するように、例外が適切に処理されることを確認する必要があります。これは、 例外の処理。
したがって、C ++では、3つのキーワードがあります。 試してみてください 、 スロー そして キャッチ 例外処理中です。
例外ブロックの一般的な構文は次のとおりです。
try{ …. # Code that is potentially about to throw exception goes here …. throw exception; } catch(exception type) { … #code to handle exception goes here }
上に示したように、誤動作する可能性のあるコードはtryブロックの下に置かれます。コードが誤動作すると、例外がスローされます。次に、この例外はcatchブロックの下でキャッチされ、処理されます。つまり、適切なアクションが実行されます。
Q#70)C ++標準の例外についてコメントしますか?
回答: C ++は、tryブロック内にコードを配置した場合にキャッチできるいくつかの標準例外をサポートしています。これらの例外は、基本クラスの一部です。 std ::例外」。 このクラスは、C ++ヘッダーファイルで定義されています。
このクラスでサポートされている例外の例は次のとおりです。
bad_alloc –「new」によってスローされます
runtime_error –ランタイムエラーに対してスローされます
bad_typeid –タイプIDによってスローされます
標準テンプレートライブラリの概要
Q#71)標準テンプレートライブラリ(STL)とは何ですか?さまざまな種類のSTLコンテナとは何ですか?
回答: 標準テンプレートライブラリ(STL)は、ANSI委員会によって標準C ++仕様に含めることが承認されたコンテナテンプレートのライブラリです。要素の格納方法に応じて、さまざまなタイプのSTLコンテナがあります。
- キュー、スタック –これらは従来のキューおよびスタックと同じであり、アダプティブコンテナーと呼ばれます。
- セット、マップ –これらは基本的に、キーと値のペアがあり、本質的に関連性のあるコンテナーです。
- ベクトル、および –これらは本質的にシーケンシャルであり、アレイと類似しています。
Q#72)イテレータクラスとは何ですか?
回答: C ++では、コンテナクラスはさまざまなオブジェクトのコレクションです。
このオブジェクトのコレクションをトラバースする必要がある場合、単純なインデックス変数を使用してトラバースすることはできません。したがって、STLには特別なクラスがあります。 イテレータ コンテナクラスの内容をステップスルーするために使用できるクラス。
イテレータのさまざまなカテゴリには、 入力イテレータ、出力イテレータ、順方向イテレータ、双方向イテレータ、ランダムアクセスなど。
Q#73)外部イテレータと内部イテレータの違いは何ですか? 外部イテレータの利点を説明してください。
回答: 内部イテレータは、ステップスルーする項目を持つクラスのメンバー関数で実装されます。
外部イテレータは、ステップスルーするアイテムを持つオブジェクトにバインドできる別個のクラスとして実装されます。外部イテレータの基本的な利点は、個別のクラスとして実装されるため、実装が簡単なことです。
次に、クラスが異なるため、多くのイテレータオブジェクトを同時にアクティブにすることができます。
さらに読む=> C#インタビューの質問
結論
この記事では、C ++インタビューのほとんどすべての主要なコーディングおよびプログラミングのトピックについて説明します。
この一連の面接の質問を使用して面接の準備をした後、候補者がリラックスできることを願っています。
面接に最適!!
推奨読書