剣指offer学習--初級c++面接問題

2102 ワード

  • は空のタイプを定義して、中にはメンバー関数とメンバー変数がなくて、このタイプに対してsizeofを求めて、得た結果はいくらですか?答えは1です.空のタイプのインスタンスには情報が含まれていません.sizeofは0であるべきですが、このタイプのインスタンスを宣言するときは、メモリに一定のスペースを占有する必要があります.そうしないと、これらのインスタンスは使用できません.メモリの消費量は、コンパイラによって決まります.Visual Studioの各空のタイプのインスタンスは、1バイトのスペースを占有します.
  • このタイプにコンストラクション関数とコンストラクション関数を追加した場合、このタイプに対してsizeofを求めると、結果はいくらになりますか?前と同じように、やはり1.コンストラクション関数とコンストラクション関数を呼び出すには、関数のアドレスを知るだけでよいが、これらの関数のアドレスはタイプに関連付けられているだけで、タイプのインスタンスに関係なく、コンパイラはこの2つの関数のためにインスタンスに追加の情報を追加しない.

  • では、構造関数を虚関数としてマークするとしますか?C++のコンパイラは、1つのタイプに虚関数があることを発見すると、そのタイプの虚関数テーブルを生成し、そのタイプの各インスタンスに虚関数テーブルを指すポインタを追加します.32ビットの機械では、1つのポインタが4バイトの空間を占めているので、sizeofが4であることを求める.64ビットの機器であれば、結果は8.
    次のコードの実行結果を分析します.
    class A
    {
    private:
        int value;
    public:
        A(int n)
        {
            value = n;
        }
        A(A other)
        {
            value = other.value;
        }
        void print()
        {
            std::cout<<value<int main()
    {
        A a = 10;
        A b = a;
        b.print();
    }

    上記のコードでは、複製コンストラクタA(A other)が入力するパラメータがAの一例である.値伝達パラメータであるため、パラメータを実パラメータにコピーすると、レプリケーション構造関数が呼び出されます.したがって、コンストラクション関数の値のコピーを許可すると、レプリケーションコンストラクション関数内でレプリケーションコンストラクション関数が呼び出され、スタックオーバーフローの原因となる永続的な再帰的な呼び出しが形成されます.したがって,C++の規格では構造関数伝達パラメータのコピーは許されないため,コンパイルエラーが発生する.この問題を解決するには,構造関数をA(const A&other)に変更すること,すなわち,伝達パラメータを定数参照に変更することができる.
    C++ではstructとclassを使用してタイプを定義できますが、この2つのタイプにはどのような違いがありますか?メンバー関数またはメンバー変数のアクセス権レベルが明記されていない場合、structではpublicがデフォルトであり、classではprivateがデフォルトです.ではC#では?C#とC++は違います.C#にメンバー関数またはメンバー変数のアクセス権が明記されていない場合、structとclassはprivateです.structとclassの違いはstructが定義した値タイプであり、値タイプのインスタンスがスタックにメモリを割り当てることである.classは参照タイプを定義し、参照タイプのインスタンスはスタックにメモリを割り当てます.