天天看点

怎么输出函数的返回值_C++ 函数:引用参数,传参机制

@all 原创连载,喜欢点关注。

12. 引用参数与传参机制

怎么输出函数的返回值_C++ 函数:引用参数,传参机制

12.1 引用变量

当我们声明一个新变量时,总会给这个变量取一个好听的名字。其实变量的名字并不是唯一的,你可以给变量起令一个别名。创建变量的别名可以通过声明一个引用变量来完成。

怎么输出函数的返回值_C++ 函数:引用参数,传参机制

上图中第15行创建了一个引用变量DPA,变量DPA(Damage per attack)就是变量damage的一个别名。

初始化引用变量必须这样做:用一个已经存在的变量来初始化引用变量。这样的话我们就明白了:引用变量实际上指向的是用来初始化的那个旧变量。

怎么输出函数的返回值_C++ 函数:引用参数,传参机制

上图中第22行我们让DPA的值增加10,然后输出damage变量的值,结果发现damage的值变为了110.f。所以修改引用变量的值等同于修改变量的值。

12.2 引用参数

引用变量有哪些用处呢?

引用变量可以作为函数的参数来使用。

怎么输出函数的返回值_C++ 函数:引用参数,传参机制

上图中的两个函数的参数都是引用类型的参数,引用参数只需要在函数声明中给变量前加上&符号就行。使用引用参数的函数实现写法和函数调用方式与使用非引用参数的函数并无差异。

但是,值得一提的是,函数仅仅由参数的引用与非引用构成的重载常常导致调用函数时二义性编译错误。

怎么输出函数的返回值_C++ 函数:引用参数,传参机制

上图中我们定义了两个交换函数,引用参数与非引用参数让这两个函数构成了重载,但是在main函数中使用函数时,产生了错误,因为编译器无法确定你是想使用哪个函数版本。所以在函数中要避免这样引用与非引用形成的重载。

12.3 返回引用值

函数的返回值也可以是一个引用类型。

怎么输出函数的返回值_C++ 函数:引用参数,传参机制

上图中函数的返回值声明为引用类型,在这个函数中返回值即为数组中元素的别名。

返回引用时特别要注意的是:不要返回局部变量的引用,这是不安全的。

怎么输出函数的返回值_C++ 函数:引用参数,传参机制

12.4 函数传参机制

1.按值传递参数

函数传递参数的方式不同对参数数据有不同的影响。

函数在传递参数时,默认采用按值传递参数机制:把要传入的数据复制了一份并把复制品传递给函数。

怎么输出函数的返回值_C++ 函数:引用参数,传参机制

上图中的运行结果我们看到函数里面a的值为2,函数外面a的值并没有改变,依然是1。

按值传递参数机制很好的保护了源数据,防止函数内部试图对用作参数的数据的修改,毕竟源数据是不希望以这样的方式被修改的。

2.按引用传递参数

如果我们把函数的参数改为引用类型,那上图中这个例子的答案会不一样吗?

怎么输出函数的返回值_C++ 函数:引用参数,传参机制

依然是同一个函数,差别是函数的第一个参数的类型声明为引用类型,运行后你会发现函数内外输出的值都为2。这是因为函数参数声明为引用类型时,就不再拷贝参数了,而直接把源变量传递给函数,这样在函数内部对引用参数的修改对源变量是有效的。

3.按常量引用传递参数

按值传递参数机制,能够保护源数据,但是变量的复制操作降低了性能;按引用传递参数机制,不存在参数的复制操作不增加性能的开销,但是产生了数据不安全问题。

在设计函数时如果既想要按值传递参数的安全性,又想保留引用参数的高效性,C++能否做到呢?可以,用常量引用类型参数。

怎么输出函数的返回值_C++ 函数:引用参数,传参机制

上图中把函数的形参a声明为const int&类型,运行函数后两次输出结果都为1。

在函数中形参a声明为const, 表明这个参数a在函数体中是不允许被修改的。如果一个函数的形参声明为声明为const &类型,既高效又安全,两全其美。怎么样,你是否也尝试这样的函数声明方式呢?