当前位置:   article > 正文

C++编程规范(参考华为编程规范)_华为c++编程规范

华为c++编程规范

第八章新增

8、类型转换

使用C++风格的类型转换,而不是C语言的类型转换

8.1、static_cast

    和C风格转换相似可做值的强制转换。

    上行转换(把派生类的指针或引用转换为基类的指针或引用),该转换经常用于消除多重继承带来的类型歧义,是相对安全的。

    下行转换(把基类的指针或引用转换为派生类的指针和引用),由于没有动态类型检查,是不安全的。

8.2、dynamic_cast

    主要用于下行转换,dynamic_cast具有类型检查功能。

    示例:

  1. extern void Fun(DerivedClass* pd);
  2. void Gun(BaseClass* pb)
  3. {
  4. //反例:C风格强制转换,转换会导致对象布局不一致,编译不报错,运行时可能会崩溃
  5. DerivedClass* pd = (DerivedClass*)pb;
  6. //正例:C++风格强制转换,明确知道pb实际指向DerivedClass
  7. DerivedClass* pd = dynamic_cast<DerivedClass*>(pb);
  8. if (pd)
  9. Fun(pd);
  10. }

8.3、reinterpret_cast (避免使用)

    用于转换不相关的类型。尝试用reinterpret_cast将一种类型强制转换另一种类型,这破坏了类型的安全性和可靠性,是一种不安全的转换。不同类型之间尽量避免转换。

8.4、const_cast(避免使用)

    const_cast用于移除对象的const属性。

    反例:

  1. unsigned const int arraySize = 1024;
  2. int &newArraySize = const_cast<int&>(arraySize);
  3. newArraySize = 2048;

    这里如果不通过引用或者指针访问arraySize,那么arraySize的值始终是1024.可是如果被作为一个指针或者引用传给其它函数进行取值的话,会发现值变成了2048。

    反例:强制去掉入参的const属性,导致函数可以对入参进行修改。

  1. void setObj(TBase const* obj)
  2. {
  3. //m_pObj的定义为:
  4. TBase *m_pObj;
  5. m_pObj = const_cast<TBase*>(obj);
  6. m_pObj->value = 123;
  7. }

第七章新增

7.1、内联函数(inline function)小于10行

如果内联函数包含复杂的控制结构,如循环、分支(switch)、try-catch等语句,一般编译器将该函数视为普通函数。

虚函数、递归函数不能被用来做内联函数。

7.2、使用内联函数代替函数式宏

说明:C++中也支持宏的功能,但是宏有其自身的缺陷(例如无法对参数进行类型检查),因此,能使用内联函数的地方,一定不使用宏。

正例:

  1. template <class TYPE_T> inline TYPE_T& max(TYPE_T& x, TYPE_T& y)
  2. {
  3. return (x > y) ? x : y;
  4. }

反例:

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

第十章新增

10.1、使用动宾词组为执行某操作的函数命名。如果是OOP方法,可以只有动词(名词是对象本身)。

示例:参照如下方式命名函数

  1. void print_record(unsigned int rec_ind);
  2. int input_record(void);
  3. unsigned char get_current_color(void);

第十三章新增

13.2、避免循环体内含判断语句,应将循环语句置于判断语句的代码块之外。

13.1、多重循环时,应将最忙的循环放在最内层,减少CPU切入循环层的次数。

反例:

  1. for (row = 0; row < 100; row++)
  2. {
  3. for (col = 0; col < 5; col++)
  4. {
  5. sum += a[row][col];
  6. }
  7. }

正例:

  1. for (col = 0; col < 5; col++)
  2. {
  3. for (row = 0; row < 100; row++)
  4. {
  5. sum += a[row][col];
  6. }
  7. }

13.2、尽量用乘法或其它方法代替除法,特别是浮点运算中的除法,因为浮点运算除法要占用较多的CPU资源。

反例:

  1. #define PI 3.1415926
  2. radius = circle_length / (2 * PI);

正例:

  1. #define PI_RECIPROCAL (1 / 3.1415926)
  2. radius = circle_length * PI_RECIPROCAL / 2

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/240880
推荐阅读
相关标签
  

闽ICP备14008679号