zoukankan      html  css  js  c++  java
  • C++——代码风格

    google代码风格

    1.使用安全的分配器(allocator),如scoped_ptr,scoped_array

    2.测试用的,其他的不能用:

      2.1 友元

      2.2 C++异常

      2.3 RTTI

    3.类型转换,不要用(int)

      3.1 static_cast:较大的算术类型赋值给较小的类型时,知道且不在乎精度损失

        double slope=static_cast<double> (j)/i;

      3.2 const_cast:常用于有函数重载的上下文    

    const char *cp;
    char *p=static_cast<char*>(cp);//正确,但不能通过p写值
    
    static_cast<string>(cp);//正确,字符串转string
    const_cast<string>(cp);//❌,const_cast只能改变常量属性

      3.3 reinterpret_cast:为运算对象的位模式提供较低层次的重新解释,危险,避免使用

    int *ip;
    char *pc=reinterpret_cast<char*>(ip);//pc指向的是一个int,而不是字符
    
    string str(pc);//错误

      3.4 dynamic_cast,RRTI运行时类型识别

    4.流用于日志,其他不要用(因为很容易用错类型)

    5. 使用assertion声明变量,而非unsigned

    6. 用于STL中,对于仿函数(functors)和特性(traits)可以不用class而用struct。其他一律用class

    7.类

    7.1 类成员有虚函数,析构函数为虚。(?)

    7.2  重载操作符&的类不能被前置声明

    7.3 尽量不要重载,而是用equals(),copyFrom()等替代

    7.4 仿函数类:

    8. *p++=*(p++)

    9.for 循环

    vector<int> v={0,1,2,3,4,5,6,7,8,9};
    for (auto &r:v)//引用才能写操作
        r*=2;

     10.如果需要
    的话,可以定义类似 Equals()、CopyFrom()等函数。
    然而,极少数情况下需要重载操作符以便与模板或“标准”C++类衔接(如
    operator<<(ostream&, const T&)),如果被证明是正当的尚可接受,但你要尽可能避
    免这样做。尤其是不要仅仅为了在 STL 容器中作为 key 使用就重载 operator==或
    operator<,取而代之,你应该在声明容器的时候,创建相等判断和大小比较的仿函数类

    11.boost库。

    优点:Boost 代码质量普遍较高、可移植性好,填补了 C++标准库很多空白,如型别特性
    (type traits)、更完善的绑定(binders)、更好的智能指针,同时还提供了 TR1(标
    准库的扩展)的实现。
    缺点:某些 Boost 库提倡的编程实践可读性差,像元程序(metaprogramming)和其他
    高级模板技术,以及过度“函数化”("functional")的编程风格。
    结论:为了向阅读和维护代码的人员提供更好的可读性,我们只允许使用 Boost 特性的一
    个成熟子集,当前,这些库包括:
    1) Compressed Pair:boost/compressed_pair.hpp;
    2) Pointer Container:boost/ptr_container 不包括 ptr_array.hpp 和序列化
    (serialization)。
    我们会积极考虑添加可以的 Boost 特性,所以不必拘泥于该规则

    12.习惯

    1. 对于智能指针,安全第一、方便第二,尽可能局部化(scoped_ptr);
    2. 引用形参加上 const,否则使用指针形参;
    3. 函数重载的使用要清晰、易读

    4. 鉴于容易误用,禁止使用缺省函数参数(值得商榷);
    5. 禁止使用变长数组;
    6. 合理使用友元;
    7. 为了方便代码管理,禁止使用异常(值得商榷);
    8. 禁止使用 RTTI,否则重新设计代码吧;
    9. 使用 C++风格的类型转换,除单元测试外不要使用 dynamic_cast;
    10. 使用流还 printf + read/write,it is a problem;
    11. 能用前置自增/减不用后置自增/减;
    12. const 能用则用,提倡 const 在前;
    13. 使用确定大小的整型,除位组外不要使用无符号型;
    14. 格式化输出及结构对齐时,注意 32 位和 64 位的系统差异;
    15. 除字符串化、连接外尽量避免使用宏;
    16. 整数用 0,实数用 0.0,指针用 NULL,字符(串)用'';
    17. 用 sizeof(varname)代替 sizeof(type);
    18. 只使用 Boost 中被认可的库。

    问题:

    1.仿函数(functors)和特性(traits):如果与 STL 结合,对于仿函数(functors)和 特 性( traits)可以不用 class 而是使用 struct。

  • 相关阅读:
    Linux日志文件utmp、wtmp、lastlog、messages
    Linux日志五大命令详解
    php 函数合并 array_merge 与 + 的区别
    MySQL对数据表进行分组查询(GROUP BY)
    如何在mysql中查询每个分组的前几名
    Autojump:一个可以在 Linux 文件系统快速导航的高级 cd 命令
    linux 查看磁盘空间大小
    js刷新页面方法大全
    [知乎有感] 读研到底为了什么,值不值得?
    [Hadoop] 在Ubuntu系统上一步步搭建Hadoop(单机模式)
  • 原文地址:https://www.cnblogs.com/yrm1160029237/p/11321031.html
Copyright © 2011-2022 走看看