C++プログラミング仕様(ファーウェイプログラミング仕様参照)


第八章新規
8、タイプ変換
C言語のタイプ変換ではなく、C++スタイルのタイプ変換を使用します.
8.1、static_cast
Cスタイル変換と似たような値の強制変換.
アップリンク変換(派生クラスのポインタまたは参照をベースクラスのポインタまたは参照に変換)は、多重継承によるタイプの曖昧さを解消するためによく使用され、比較的安全です.
下り変換(ベースクラスのポインタや参照を派生クラスのポインタや参照に変換)は、ダイナミックタイプチェックがないため安全ではありません.
8.2、dynamic_cast
主に下り変換に使用され、dynamic_castにはタイプチェック機能があります.
例:
extern void Fun(DerivedClass* pd);
void Gun(BaseClass* pb)
{
    //  :C      ,            ,     ,        
    DerivedClass* pd = (DerivedClass*)pb;

    //  :C++      ,    pb    DerivedClass
    DerivedClass* pd = dynamic_cast(pb);

    if (pd)
        Fun(pd);
}

8.3、reinterpret_cast(使用を避ける)
関連しないタイプを変換します.reinterpret_を使ってみますcastは、タイプのセキュリティと信頼性を破壊し、安全ではない変換である別のタイプを強制的に変換します.異なるタイプの間では、できるだけ変換を避けます.
8.4、const_cast(使用を避ける)
    const_castオブジェクトを除去するためのconstプロパティ.
反例:
  unsigned const int arraySize = 1024;
  int &newArraySize = const_cast(arraySize);
  newArraySize = 2048;

ここでarraySizeに参照またはポインタでアクセスしない場合、arraySizeの値は常に1024である.しかし、ポインタや参照として他の関数に渡されて値を取ると、値は2048になることがわかります.
反例:入力パラメータのconstプロパティを強制的に削除すると、関数が入力パラメータを変更できます.
  void setObj(TBase const* obj)
  {
      //m_pObj    :
      TBase *m_pObj;
      m_pObj = const_cast(obj);
      m_pObj->value = 123;
  }

第七章新規
7.1、インライン関数(inline function)が10行未満
インライン関数にループ、ブランチ、try-catchなどの複雑な制御構造が含まれている場合、一般コンパイラはこの関数を一般関数と見なします.
ダミー関数、再帰関数は、インライン関数として使用できません.
7.2、関数マクロの代わりにインライン関数を使用する
説明:C++ではマクロの機能もサポートされていますが、マクロにはそれ自体の欠陥(例えばパラメータのタイプチェックができない)があるので、インライン関数が使えるところは、マクロを使わないに違いありません.
正例:
  template  inline TYPE_T& max(TYPE_T& x, TYPE_T& y)
  {
      return (x > y) ? x : y;
  }

反例:
  #define MAX(x, y) ((x) > (y) ? (x) : (y))

第十章新規
10.1、ある操作を実行する関数に動賓語群を使用して名前を付ける.OOPメソッドであれば、動詞(名詞は対象そのもの)のみでよい.
例:関数の名前は次のように指定します.
  void print_record(unsigned int rec_ind);
  int input_record(void);
  unsigned char get_current_color(void);

第十三章新規
13.2、循環内に判断文が含まれないように、循環文を判断文のコードブロックの外に置く.
13.1、多重サイクルの場合、最も忙しいサイクルを最内層に置き、CPUがサイクル層に入る回数を減らす.
反例:
  for (row = 0; row < 100; row++)
  {
      for (col = 0; col < 5; col++)
      {
          sum += a[row][col];
      }
  }

正例:
  for (col = 0; col < 5; col++)
  {
      for (row = 0; row < 100; row++)
      {
          sum += a[row][col];
      }
  }

13.2、できるだけ除算の代わりに乗算あるいはその他の方法で、特に浮動小数点演算中の除算で、浮動小数点演算除算は多くのCPU資源を占有するためである.
反例:
  #define PI 3.1415926
  radius = circle_length / (2 * PI);

正例:
  #define PI_RECIPROCAL (1 / 3.1415926)
  radius = circle_length * PI_RECIPROCAL / 2;