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

目录
相关文章
|
29天前
|
存储 Java C++
C++ 引用和指针:内存地址、创建方法及应用解析
C++中的引用是现有变量的别名,创建时需用`&`运算符,如`string &meal = food;`。指针存储变量的内存地址,使用`*`创建,如`string* ptr = &food;`。引用必须初始化且不可为空,而指针可初始化为空。引用在函数参数传递和提高效率时有用,指针适用于动态内存分配和复杂数据结构操作。选择使用取决于具体需求。
40 9
|
1月前
|
存储 安全 编译器
【C++专栏】C++入门 | 函数重载、引用、内联函数
【C++专栏】C++入门 | 函数重载、引用、内联函数
27 0
|
11天前
|
存储 安全 编译器
【C++入门】缺省参数、函数重载与引用(下)
【C++入门】缺省参数、函数重载与引用
|
2天前
|
存储 安全 C++
深入理解C++中的指针与引用
深入理解C++中的指针与引用
5 0
|
11天前
|
编译器 C语言 C++
【C++入门】缺省参数、函数重载与引用(上)
【C++入门】缺省参数、函数重载与引用
|
12天前
|
编译器 C++
【C++进阶】引用 & 函数提高
【C++进阶】引用 & 函数提高
|
17天前
|
存储 人工智能 编译器
【重学C++】【引用】一文看懂引用的本质与右值引用存在的意义
【重学C++】【引用】一文看懂引用的本质与右值引用存在的意义
34 0
|
18天前
|
数据安全/隐私保护 C++
C++ 构造函数实战指南:默认构造、带参数构造、拷贝构造与移动构造
C++中的构造函数是特殊成员函数,用于对象初始化。类型包括默认构造函数(无参数)、带参数构造函数、拷贝构造函数和移动构造函数。默认构造函数设置对象默认状态,带参数构造函数允许传递初始化值。拷贝构造函数复制已有对象,移动构造函数高效转移资源。构造函数的访问权限可控制为public、private或protected。理解构造函数有助于编写健壮的C++代码。关注公众号`Let us Coding`获取更多内容。
25 0
|
22天前
|
数据安全/隐私保护 C++
C++ 类方法解析:内外定义、参数、访问控制与静态方法详解
C++ 中的类方法(成员函数)分为类内定义和类外定义,用于操作类数据。类内定义直接在类中声明和定义,而类外定义则先在类中声明,再外部定义。方法可以有参数,访问权限可通过 public、private 和 protected 控制。静态方法与类关联,不依赖对象实例,直接用类名调用。了解这些概念有助于面向对象编程。
16 0
|
24天前
|
存储 安全 编译器
【C++成长记】C++入门 |函数重载、引用、内联函数
【C++成长记】C++入门 |函数重载、引用、内联函数