C++常記知識点

2129 ワード

1、もし.hファイルにstaticグローバル変数が宣言され、複数のソースファイルに#includeを使用してヘッダファイルが含まれている場合:
複数のソースファイルには、個別のコピーが含まれており、初期値は同じです.これらのコピーは互いに独立しており、静的グローバル変数の値を変更すると、静的グローバル変数の他のコピーには影響しません.
2、インライン関数とマクロ定義の違い:
  • インライン関数:コンパイル段階で展開;関数であり、関数の基本的な性質を持ち、普通の関数のようにデバッグすることができます.クラスのメンバー関数として使用する場合は、クラスメンバーにアクセスできます.thisポインタも使用できます.
  • マクロ定義:前処理フェーズで展開;文字列の置換だけです.マクロ定義関数はクラスのメンバー関数にはなりません.

  • 3、sizeof
  • は単一演算子であり、関数ではありません.
  • sizeofは、構造体のサイズを返すことができますが、構造体メンバー変数のサイズを返すことはできません.

  • 4、メモリの位置合わせ
  • データ整列:構造体のメンバーを処理する場合、メモリ内のメンバーの開始アドレス符号化は、メンバータイプが占めるバイト数の整数倍でなければなりません.
  • 構造体sizeof計算の結果は、構造体の中で最も空間を占有するメンバーが占める空間の整数倍でなければならない.

  • 5、main関数の実行前後に何が起こりましたか.
    実行前:グローバルオブジェクトと静的オブジェクトのコンストラクション関数を呼び出します.基本データ型のグローバル変数と静的変数を初期化します.
    実行後:atexit関数に登録されている関数を呼び出し、呼び出し順序と登録順序が逆になります.
    6、同じ内容の文字列定数で、文字列定数領域にコピーが1部しかありません.
    7、配列名がパラメータである場合、配列ヘッダ要素を伝達するアドレスに相当し、実パラメータがアドレスである限り、形パラメータはポインタであるに違いない.
    次の4つの宣言は等価です.
    void equal(int* a, int* b);
    void equal(int a[], int b[]);
    void equal(int a[1], int b[2]);
    void equal(int a[100], int b[100]);

    8、ハンドル
    ハンドルは32ビットの符号なし整数であり、オブジェクトのメモリアドレスリストの整数インデックスであり、リソースに割り当てられた一意の識別である.(ここでのオブジェクトとは、アプリケーションインスタンス、ウィンドウ、ビットマップ、GDIなどのリソースオブジェクトを指す)
    ハンドルは、リソースオブジェクトを直接指すのではなく、リソース登録リスト内のリソースオブジェクトのインデックスを保存します.解決するのは、リソースオブジェクトの物理アドレスが変化したことによるアクセス失効の問題です.
    ハンドルとポインタの違い:
  • 使用上:ポインタはポインタが指す内容を直接修正することができる.ハンドルはWindowsが提供するAPI関数を呼び出すだけで、ユーザーが勝手にシステムリソースを変更することを防止します.
  • の概念は、ポインタが任意に1つのオブジェクトを指すことができることである.ハンドルは、リソースオブジェクトのみを間接的に指すことができます.

  • 9、関数ポインタ
    関数ポインタを定義する場合は、指定した関数の戻り値タイプとパラメータリストタイプを指定する必要があります.
    データ型(*ポインタ変数)(パラメータリスト)
    int max(int a, int b);
    int(*p)(int, int);
    p = max;
    int z = p(1, 2);

    10、定数参照
    使用不可:
    int &a = 10;

    定数参照を使用する必要があります.
    const int &a = 10;

    実際には、コンパイラの内部では2つのステップに分けて実行されます.
  • まず、定数を一時変数に格納する.
  • そして、この一時変数を使用して定数参照を初期化する.
  • int temp = 10;
    const int &a = temp;