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<DerivedClass*>(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<int&>(arraySize);
  newArraySize = 2048;

    這裏如果不通過引用或者指針訪問arraySize,那麼arraySize的值始終是1024.可是如果被作爲一個指針或者引用傳給其它函數進行取值的話,會發現值變成了2048。

    反例:強制去掉入參的const屬性,導致函數可以對入參進行修改。

  void setObj(TBase const* obj)
  {
      //m_pObj的定義爲:
      TBase *m_pObj;
      m_pObj = const_cast<TBase*>(obj);
      m_pObj->value = 123;
  }

第七章新增

7.1、內聯函數(inline function)小於10行

如果內聯函數包含複雜的控制結構,如循環、分支(switch)、try-catch等語句,一般編譯器將該函數視爲普通函數。

虛函數、遞歸函數不能被用來做內聯函數。

7.2、使用內聯函數代替函數式宏

說明:C++中也支持宏的功能,但是宏有其自身的缺陷(例如無法對參數進行類型檢查),因此,能使用內聯函數的地方,一定不使用宏。

正例:

  template <class TYPE_T> 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;

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章