Google C++ Coding Style:引用参数

简介: Google C++ Coding Style定义输入参数以值或者const引用形式传入,输出参数使用指针。

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. 传指针时空值是合法的,需要判空,也没有拷贝的开销。

目录
相关文章
|
1月前
|
算法 编译器 C++
【C++篇】领略模板编程的进阶之美:参数巧思与编译的智慧
【C++篇】领略模板编程的进阶之美:参数巧思与编译的智慧
77 2
|
2月前
|
程序员 C++ 容器
C++编程基础:命名空间、输入输出与默认参数
命名空间、输入输出和函数默认参数是C++编程中的基础概念。合理地使用这些特性能够使代码更加清晰、模块化和易于管理。理解并掌握这些基础知识,对于每一个C++程序员来说都是非常重要的。通过上述介绍和示例,希望能够帮助你更好地理解和运用这些C++的基础特性。
41 0
|
2月前
|
JavaScript 前端开发 测试技术
一个google Test文件C++语言案例
这篇文章我们来介绍一下真正的C++语言如何用GTest来实现单元测试。
20 0
|
4月前
|
存储 安全 C++
浅析C++的指针与引用
虽然指针和引用在C++中都用于间接数据访问,但它们各自拥有独特的特性和应用场景。选择使用指针还是引用,主要取决于程序的具体需求,如是否需要动态内存管理,是否希望变量可以重新指向其他对象等。理解这二者的区别,将有助于开发高效、安全的C++程序。
32 3
|
4月前
|
算法 编译器 程序员
C++为什么有参数依赖查找(ADL)?
为什么在限定名称查找和非限定名称查找之外,C++还要提供参数依赖查找这样的机制呢?它其实是在规范的查找框架下,提供了一种灵活性的补充
|
4月前
|
编译器 C++ 容器
C++一分钟之-可变模板参数与模板模板参数
【7月更文挑战第21天】C++的模板实现泛型编程,C++11引入可变模板参数和模板模板参数增强其功能。可变模板参数(如`print`函数)用于处理任意数量的参数,需注意展开参数包和递归调用时的处理。模板模板参数(如`printContainer`函数)允许将模板作为参数,需确保模板参数匹配和默认值兼容。这些特性增加灵活性,但正确使用是关键。
56 4
|
4月前
|
存储 自然语言处理 编译器
【C++入门 三】学习C++缺省参数 | 函数重载 | 引用
【C++入门 三】学习C++缺省参数 | 函数重载 | 引用
|
5月前
|
C++
C++引用
C++引用
|
4月前
|
C++
C++基础知识(二:引用和new delete)
引用是C++中的一种复合类型,它是某个已存在变量的别名,也就是说引用不是独立的实体,它只是为已存在的变量取了一个新名字。一旦引用被初始化为某个变量,就不能改变引用到另一个变量。引用的主要用途包括函数参数传递、操作符重载等,它可以避免复制大对象的开销,并且使得代码更加直观易读。
|
4月前
|
存储 自然语言处理 编译器