Google C++ Coding Style:引用参数

Google C++ Coding Style定义

输入参数以值或者const引用形式传入,输出参数使用指针。 所有以引用形式输入参数必须加上const,即const T&的形式。

即如下形式:

void Foo(const string &in, string *out);

在如下情况下, 可以使用const T*的形式:

* 需要进行指针的判空 (即空指针是合理的)。

* 需要使用到输入参数的指针或引用形式。

为什么要使用const T&形式?

以值传入是最为安全的形式,因为它总是提供一个复本到函数中。对于复杂的参数(结构或类),这也引入了不必要的拷贝的开销。使用指针及引用都可以解决这个问题。而引用则更为安全,可以避免一些不必要的空指针判断。所以输入参数以const T&的形式的定义, 与传递值的语义相似,既避免了拷贝,又避免了意外修改。

下面这个例子,则表现出函数即使定义为const T&形式,仍然可能出现空指针引入的问题:

 void test(const A& a) {
    a.max = 10;
 }

 A* b = NULL;
 test(*b);

这是一个错误使用引用的示范,语法上合法,但这样的实现是不允许的。判空的责任在于调用者,而不在函数。(参考:How do you check for NULL when passing by reference in C++?

另外,因为传引用,在其本质也是以指针形式提供的,所以在性能相对于传值会低一些的。所以简单的数据类型还是要传值。

输出参数为什么是指针呢

以引用和指针的形式,都可以作为函数的输出参数。如果没有const修饰引用,则引用形式的参数就可以成为一个输出参数。这可能会让代码的读者对参数的类型产生错觉。正是Google C++ Coding Style中所描的: 引用有着和值类的语法,但却是指针的语义。代码的读者会对能不能改变一个参数的值产生疑问, 以为传入的是Value, 但值却改变了。虽然看一下函数声明就可以了,但如果一个大型项目,还是要追求做到一目了然。

总结

作为编码规范定义出来的,主要是为了统一大家的编码习惯,减少一些”惊喜”。单纯从传值,传引用,亦或传指针的形式,cplusplus.com上的一篇也可以作为参考When to pass parameters by value, reference, and pointer。总结一下参数三种传入形式的核心点:

1. 传值性能最高,但有拷贝的开销。

2. 传引用时空值是不合法的,不用判空,没有拷贝的开销。

3. 传指针时空值是合法的,需要判空,也没有拷贝的开销。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-09 13:24:24

Google C++ Coding Style:引用参数的相关文章

Google C++ Coding Style:右值引用(Rvalue Reference)

右值引用是一个C++11特性,标记为T&&.GSG中定义:只为移动建构函数(Move constructor)和移动赋值操作(Move assignment)使用右值引用.并且不要使用std::Forward(提供的完美转发特性). C++中右值指表达式结束时就不再存的临时对象.在C++11中,右值分为纯右值(即原始字面量,表达式产生的临时变量等),以及一个将亡值(expiring value, 使用<<深入应用C++11>>中的译法,指的是与右值引用相关的表达式,

google objective-c coding style(3)注释

注释 虽然写起来很痛苦,但注释是保证代码可读性的关键.下面的规则给出了你应该什么时候.在哪进行注释.记住:尽管注释很重要,但最好的代码应该自成文档.与其给类型及变量起一个晦涩难懂的名字,再为它写注释,不如直接起一个有意义的名字. 当你写注释的时候,记得你是在给你的听众写,即下一个需要阅读你所写代码的贡献者.大方一点,下一个读代码的人可能就是你! 记住所有 C++ 风格指南里的规则在这里也同样适用,不同的之处后续会逐步指出. 文件注释 Tip 每个文件的开头以文件内容的简要描述起始,紧接着是作者,

google objective-c coding style(2)命名

对于易维护的代码而言,命名规则非常重要.Objective-C 的方法名往往十分长,但代码块读起来就像散文一样,不需要太多的代码注释. 当编写纯粹的 Objective-C 代码时,我们基本遵守标准的 Objective-C naming rules,这些命名规则可能与 C++ 风格指南中的大相径庭.例如,Google 的 C++ 风格指南中推荐使用下划线分隔的单词作为变量名,而(苹果的)风格指南则使用驼峰命名法,这在 Objective-C 社区中非常普遍. 任何的类.类别.方法以及变量的名字

google objective-c coding style(4)COCOA 和 OBJECTIVE-C 特性

成员变量应该是 @private Tip 成员变量应该声明为 @private @interface MyClass : NSObject { @private id myInstanceVariable_; } // public accessors, setter takes ownership - (id)myInstanceVariable; - (void)setMyInstanceVariable:(id)theVar; @end 明确指定构造函数 Tip 注释并且明确指定你的类的构

google objective-c coding style(5)Cocoa模式

委托模式 Tip 委托对象不应该被 retain 实现委托模式的类应: 拥有一个名为 delegate_ 的实例变量来引用委托. 因此,访问器方法应该命名为 delegate 和 setDelegate:. delegate_ 对象不应该被 retain. 模型/视图/控制器(MVC) Tip 分离模型与视图.分离控制器与视图.模型.回调 API 使用 @protocol. 分离模型与视图:不要假设模型或者数据源的表示方法.保持数据源与表示层之间的接口抽象.视图不需要了解模型的逻辑(主要的规则是

google objective-c coding style(1)留白和格式

不要求在 @interface.@implementation 和 @end 前后空行.如果你在 @interface 声明了实例变量,则须在关括号 } 之后空一行. 空格 vs. 制表符 只使用空格,且一次缩进两个空格. 我们使用空格缩进.不要在代码中使用制表符.你应该将编辑器设置成自动将制表符替换成空格. 行宽 尽量让你的代码保持在 80 列之内. 通过设置 Xcode > Preferences > Text Editing > Show page guide,来使越界更容易被发现

python coding style guide 的高速落地实践

python coding style guide 的高速落地实践 机器和人各有所长,如coding style检查这样的可自己主动化的工作理应交给机器去完毕,故发此文帮助你在几分钟内实现coding style的自己主动检查. 1.有哪些著名的Python Coding Style Guide PEP8 https://www.python.org/dev/peps/pep-0008/ 发明Python语言丰碑人物Guido van Rossum的亲自写的Coding Style, 知名度5颗

Google&#39;s C++ coding style

v0.2 - Last updated November 8, 2013 源自 Google's C++ coding style rev. 3.274 目录 由 DocToc生成     头文件        #define用法        前向声明        内联函数        -inl.h文件        函数参数顺序        include的命名和顺序    作用域        命名空间            未命名空间            命名空间       

[CPP] Coding Style

C++ Coding Style C++很多强大的语言特性导致它的复杂,其复杂性会使得代码更容易出现bug.难于阅读和维护. 本Coding Style用来约束C++编程,使得代码在有效使用C++语言特性的同时易于管理[代码的一致性高于一切]. 参考:<Google C++ Style Guide> 分类 标题 规则 备注(示例) 头文件 每个.cc文件都应对应一个.h文件 #define保护 1.  #define PROJECT_PATH_FILE_H_ 防止.h文件被多重包含: 1. P