函数返回值和返回引用的区别 int&func()与int func()

我在写C++primer时遇到了这个题,很疑惑为什么这里需要使用int &类型。当我把&号删去时发现编译报错。

于是我查阅资料,搜索int &func和int func()的区别得出以下结论。 

函数返回时会产生一个临时变量作为函数返回值的副本,而返回引用时不会产生值的副本。比如下面这段代码

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include<vector>
using namespace std;
string func(string s1, string s2) {
	return s1.size() < s2.size() ? s1 : s2;
}
int main(void) {
	string s1 = "last xuan";
	string s2 = "otto";
	cout<<func(s1, s2);
}

调用函数string func()时,产生了一个临时变量作为函数返回值的副本,副本储存的是size()的值,然后将副本的值传出去,但是如果时使用string &类型时,则不会产生副本。直接返回想要返回的值。

注意事项

        不能返回局部变量,函数的形参,在函数体内部定义的变量都是局部变量

string &func(string s1, string s2) {
	return s1.size() < s2.size() ? s1 : s2;
}
int main(void) {
	string s1 = "last xuan";
	string s2 = "otto";
	cout<<func(s1, s2);
}

 如果我们将形参的引用符号删去,s1和s2就变成了局部变量,当函数执行完毕,程序将释放分配给局部对象的存储空间。此时,对局部对象的引用就会指向不确定的内存。

可以看到什么都没有输出 ,正确代码为下图,所以使用引用函数时一定要将形参也设为引用类型

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include<vector>
using namespace std;
string &func(string &s1, string &s2) {
	return s1.size() < s2.size() ? s1 : s2;
}
int main(void) {
	string s1 = "last xuan";
	string s2 = "otto";
	cout<<func(s1, s2);
}

 

以上函数的返回值是引用类型。无论返回s1或是s2,调用函数和返回结果时,都没有复制这些string对象。简单的说,返回的引用是函数的参数s1或s2,同样s1和s2也是引用,而不是在函数体内产生的。

把引用作为函数返回值

通过使用引用来替代指针,会使 C++ 程序更容易阅读和维护。C++ 函数可以返回一个引用,方式与返回一个指针类似。
当函数返回一个引用时,则返回一个指向返回值的隐式指针。这样,函数就可以放在赋值语句的左边。本题就是用到了这一点。

猜你喜欢

转载自blog.csdn.net/lxyhhhhhcl/article/details/131879708