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,字符(串)用'\0';
17. 用 sizeof(varname)代替 sizeof(type);
18. 只使用 Boost 中被认可的库。

 

问题:

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

posted @ 2019-08-24 14:26  寒江小筑  阅读(575)  评论(0编辑  收藏  举报