C++/C小知識点(2)

3232 ワード

負数の右シフト操作
負数の>>操作は、結果は言語の実現に依存し、左側に空いている位置は、0を埋めるか、1を埋めるかのいずれかです.
 
静的ローカルオブジェクト
組み込み型のローカルオブジェクトが明示的に初期化されていない場合、値は初期化されません.組み込みタイプとユーザー定義タイプを含む静的ローカルオブジェクト、グローバルオブジェクト.初期化が指定されていない場合、コンパイラは自動的に0に初期化されます.
 
コピーコンストラクタ
      A(A copy){…};許可されていません.許可されると、無限の再帰呼び出しが発生します.正しいパラメータはconst A©です.[コピー](Copy)オペレータにはこの制限はありません.
 
カスタムStringクラスのコピーコンストラクタと付与オペレータの実装
異常なセキュリティを考慮すべきことが実現される.(高品質プログラミングP 241)
付与オペレータの実装には、4つのステップに注意する必要があります:1、自己付与をチェックします.2、新しいメモリ資源を割り当て、内容をコピーする.3、既存のメモリ資源を解放する.4、オブジェクトの参照を返します.
上記の方法に加えて、swap関数をカスタマイズし、コピーコンストラクション関数を呼び出すことで実現することもできます.
 
既定のパラメータ値
デフォルト値は関数宣言に設定する必要があります.関数定義には設定できません.複数の既定のシェイプパラメータがある場合は、後からずっとデフォルトにするしかありません.
 
コンテナ要素タイプ
コンテナ要素タイプとして使用されるclassは、=、=、<などの演算子を再ロードする必要があります.コンテナでは、エレメントをソートまたはコピーするために使用される可能性があるため、一部の汎用アルゴリズムでは、エレメントタイプが=、<など再ロードされたと仮定します.
 
再ロードできない演算子
一部の演算子は、オブジェクトではなくメンバー名などの名前であるため、リロードが許可されません.一方,安全性を考慮し,混乱や誤りを防止する.再ロードできない演算子は1です.2 .* 3::4 ?: 5 sizeof typeid 6 4種類の変換オペレータ
 
リロード後++と--
メタオペレータは、一般に非静的メンバー関数として再ロードされます.後置の減算、インクリメントオペレータを再ロードし、前置との区別のために宣言時にダミーを設定する必要があります.Integerクラスの後置++オペレータの再ロードのように:Integer operator+(int){...}です.また、++操作を行う前に、Integer temp=*thisを定義する必要があります.最後に戻るようにします.
オートインクリメントオペレータとオートインクリメントオペレータが基本データ型に適用される場合、フロント・バージョンとバック・バージョンは効率的に大きな差はありません.しかしながら、ユーザ定義タイプ、特に大きなオブジェクトに適用される場合、前置バージョンは後置バージョンよりも効率的になります.バックバージョンでは一時的なオブジェクトを作成し、戻ってきたら破棄するため、戻ってきたときにコピーコンストラクション関数も呼び出されます.
 
inline関数
マクロ定義に比べて、メリット:1、debugバージョンでデバッグできます(debugバージョンではインラインされていません).2、コンパイラはインライン関数をコンテキストプログラムに従って最適化することができ、通常の関数も最適化することができない.なぜなら、関数体に入ると環境コンテキストから離れてしまうからである.3、実行時にタイプチェックができます.
inlineキーワードは、関数をインライン化し、宣言に無効にするには、関数定義体と一緒に配置する必要があります.inlineはコンパイラに対する申請にすぎず、本当にinlineするかどうかはコンパイラにかかっている.
インライン関数はコード膨張を代価として,関数呼び出しパラメータ圧局,ジャンプ,戻りなどのオーバーヘッドを交換する.一般に,コードが短く,ループや複雑な制御構造を含まない関数をインラインとして宣言する.コンストラクション関数およびコンストラクション関数は、一般に多くの関数呼び出しが隠されているため、インラインとして宣言できません.
 
C++における強制型変換
      const_castは、オブジェクトのconst/volatileプロパティを除去するために使用できます.reinterpret_castは、1つの整形を1つのポインタに変換したり、2つの具象ポインタ間で変換したりするために使用することができる.注意すべきは、void*を具象ポインタに変換するにはstatic_を使用する必要があることです.cast.
 
データ抽出
class Point{

public:

  Point(float x);

  operator float() const    //    、    

  {

    return m_x;

  }

private:

  float m_x;

}

非explicitコンストラクション関数は、他のタイプのオブジェクトを暗黙的にthisオブジェクト、すなわち内側に変換することができます.C++は、thisオブジェクトを他のデータ型オブジェクトに変換できるカスタム型変換演算子という逆方向変換方法も提供します.
タイプ変換演算子定義はoperatorキーワードで始まり、ターゲットタイプ名と()に続く.パラメータはありませんが、実際にはこれがパラメータです.戻りタイプもなく、実際には関数名が戻りタイプです.非静的メンバー関数としてのみ定義できます.
タイプ変換演算子を定義する利点は、コンパイラが変換関数を自動的に呼び出して変換を完了するターゲットタイプが必要な場所で直接使用できることです.
   1: Point p2(100.25);
   2: Integer aInt(100);
   3: cout << p2 << endl;      //100.25
   4: cout << aInt << endl;    //100

これにより、PointとIntegerに<<演算子を再ロードする必要がなくなります.