【C++】Google C++编码规范(四):其他C++

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010168781/article/details/82751152

引用参数

所有按引用传递的参数必须加上const;
这在Google Code上是一个硬性约定:输入参数是值参或const的引用参数,输出参数为指针,输入参数可以是```const`指针,但决不能是非const的引用参数,除非用于交换,比如swap();

右值引用

关于右值引用的建议是:只在定义移动构造函数和移动赋值操作时使用右值引用,不建议使用std::forward功能函数。可以使用std::move来表示将值哦那个一个对象移动到另一个对象,而不是复制到另一个对象。

函数重载

我的理解是:只有在一眼就能看出重载函数的参数不同,非常明显的想要表达给使用者意图的情况下使用重载,比如参数个数不同;
google的建议是:在函数名里添加参数信息,不要为了显摆会使用重载而使用重载。

缺省参数

google不建议使用缺省参数,除了以下三种情况:
1、构造函数;
2、.c文件里的静态函数或匿名函数等,只在局部文件里调用;
3、模拟变长数组;
不使用的原因是:缺省参数会干扰函数指针,尤其是在现有函数中添加了缺省参数,会改变它的类型,调用其地址时会报错。
我的一个经历是:在对同一个成员变量的初始化和使用函数中使用了缺省参数,但是缺省的值又不相同,造成初始化后的上下文和使用默认调用时不一致,不仔细就会出错。

变长数组和 alloca()

google不允许使用变长数组和alloca();
使用std::vectorstd::unique_ptr<T[]>来代替。
alloca函数是在栈上分配内存,有时移植代码时会出现意想不到的问题。

友元

google:允许合理的使用友元类及友元函数;
比如:只允许另一个类访问该类的私有成员时,可以使用友元;而不用将私有成员改成公有成员public;在单元测试时,会经常用到。

异常

google明确禁止使用异常,因为它以前的代码都没有异常,如果在新项目中使用异常,需要重新实现以前的代码;
但是构造函数失败只有异常可以处理,还是根据自己的情况决定把。

运行时类型识别

google禁止使用RTTI(运行时类型识别);
即禁止使用typeiddynamic_cast
在运行时去判断类型,通常意味着这是设计问题。可以多态或访问者设计模式来代替

类型转换

C++的类型转换建议使用static_cast<>()来代替int y=(int)x等方式;
使用const_cast来去掉const限定符;
reinterpret_cast的使用必须要谨慎,它类似与C的强制转换,(名字这么长就不要用了);

google建议:只有在记录日志时使用流;
流的缺点:处理性能低、不能实现软件国际化(因为流不支持字符串操作符重新排序);
建议使用printf+read/write来代替

++i 还是 i++?

google建议使用++i、–i(前置自增自减),尤其是对迭代器和模板类类型时。
因为++i 比 i++ 效率高,i++(后置自增、自减需要对i进行一次拷贝,如果i是迭代器或类等,拷贝的代价比较大);

const

google强烈建议在可以使用const的情况下,都去使用它。
1、const形参:函数内部不修改形参;
2、const函数:函数不修改成员变量并且不调用非const函数;
3、const成员:对象构造后不再发生改变;

constexpr

constexpr是真正意义上的常量,在编译时就确定了;
const在初始化后才确定,可以在运行时确定;

猜你喜欢

转载自blog.csdn.net/u010168781/article/details/82751152
今日推荐