後輩たち、この5つの問題ができないなら、C++の面接に行かないでください.


目次
第一題
第二題
第三題
第四題
第五題
「ガイド」は江湖をぶらぶらするには武芸が必要で、面接に行くにも通常のスキルが必要だ.C++の職場を面接したいなら、一定の基礎知識が必要です.今すぐこの文章で自分の知識の備蓄状況を検証して、すべて正解できるなら、C++関連の基礎知識が身につけていることを説明したほうがいいです.もし1、2つの答えが正しいかできないならば、あなたがもっと努力しなければならないことを説明して、基礎を固めることが重要です.タイトル経典、コレクションを歓迎します!
 
第一題
オブジェクト向けプログラミングの3つの特徴は?
答え:継承、パッケージ、マルチステート.
知識の背景:
継承の目的は、コードの多重性と拡張性を向上させることである.カプセル化の目的は変数の安全性を保証するためであり、使用者は具体的な実装の詳細を気にする必要はなく、外部インタフェースを通じてクラスのメンバーにアクセスすることができるだけである.マルチステートの目的は、動的アセンブリを実現し、プログラムの実行効率を向上させ、メンテナンスと操作を容易にすることです.これもC++とC言語の違いで、C言語はプロセス向けの言語で、彼の核心は関数で、C++はオブジェクト向けの言語で、彼の核心はクラスとオブジェクトです.実は、C++はC言語のスーパーセットです.
これはかなり基礎的な質問で、面接の時に直接passされるかどうかを決めました.もしあなたができないなら、気をつけてください.
 
第二題
C++のメモリはどんな種類がありますか?
答え:スタック(malloc)、スタック(stack)、プログラムコード領域、グローバル/静的ストレージ領域、定数ストレージ領域.
知識の背景:
スタック領域:new申請で割り当てられたメモリブロックで、アプリケーションによって申請と解放を動的に制御します.プログラムが正しく解放されていない場合、プログラムが終了すると、オペレーティングシステムによって自動的に回収されます.
スタック領域:コンパイラによって自動的に申請され、解放されるメモリブロック.通常、ローカル変数、一時変数、関数パラメータを格納するために使用されます.実行効率は高いが、割り当てられたメモリ容量は限られている.
プログラムコード領域:プログラムバイナリコードを格納します.
≪グローバル/静的ストレージ領域|Global/Static Storage Area|emdw≫:グローバル変数と静的変数は1つのブロックに格納され、プログラムが終了するとシステムによって解放されます.
定数ストレージ:定数を格納するメモリブロックで、変更は許可されません.
C++プログラミングはメモリの管理問題にかかわることが多いので、C++メモリのストレージタイプについては、把握する必要があります.
 
第三題
クラスのサイズに影響する要素はどれですか?
答え:非静的データメンバーの数、虚関数があるかどうか、位置合わせ方法.
知識の背景:
1つのクラスのサイズ=すべての非静的データ・メンバーのサイズ+虚関数テーブル+整列によって複数のバイト.ここで、虚関数の数にかかわらず、虚関数テーブルを指すポインタは1つのみで、4バイト(32ビット・システム)または8バイト(64ビット・システム)を占有します.
引用したテーマ:
64ビットシステムには、次のクラスがあります.
class C
{
public:
    char a;
    static char b;
    void *p;
    static int *c;
    virtual void func1();
    virtual void func2();
};

では、sizeof(C)の数値は?
面接でよくある問題で、自分が出会ったC++筆記試験の問題のうち、80%が出会ったことがあります.
 
第四題
gcc環境では、配列int arr[5]={1,2,3,4,5}が知られている.では*(*(&arr+1)-1)の結果は何ですか?
答え:5.
知識の背景:
変数のアドレスを取得する場合は、アドレス演算子&、ポインタ変数が指すデータを取得する場合は、値演算子*を使用します.
アドレス演算子&と値演算子*は実際の開発でほとんど毎日出会うことができますので、重視してください.
 
第五題
以下の代表にいくつかの間違いがあることを指摘してください.
#include
class A
{
    public:
      virtual void f(){}
    public :
       A()
       {
           f();
       }
};
class B1:public A()
{
    private:
        char *_s;
    public:
        B1()
        {
            _s=new char[1024];
        }
    private:
        void f()
        {
            delete _s[];
            _s=NULL;
        }
};
class B2:public A
{
    private:
        int * _m;
    public:
        B2()
        {
            _m=new int(2016);
        }
    private:
        virtual void f()
        {
            delete _m;
            _m=NULL;
        }
}
int main()
{
    A* a1=new B();
    A* a2=new B2;
    delete a1;
    delete a2;
    return 0;
}

答え:6箇所、修正後は以下のようになります.
line12     class B1:public A
line24     delete[] _s;
line43     };
line46     A *a1 = new B1();
知識の背景:
line 12:継承構文エラー、Aの後ろに括弧を付けるべきではありません.
line 24:配列構文エラーを削除します.カッコは配列変数の前にあるはずです.
line 43:クラス定義構文エラー、カッコ後はセミコロンで終了する必要があります.
line 46:定義されていないエラー.
すべていくつかの基礎の文法の常識で、一方で眼力を練習して、一方で自分の実際の符号化能力を検査します.
 
どうですか.全部でいくつ正解しましたか.コメントへようこそ!