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。