背景:
c
c的参数传递是按照值传递的,如果有很大的数据项,复制数据需要很长的时间,出现性能问题
(当然可以使用指针可避免这问题)
c++
1.按值传递
2.按引用传递,避免复制大量的数据开销,提高性能
引用
1.引用是别名,在声明的时候必须初始化,在实际的代码中主要用做函数的形参。引用作为目标的别名而使用,对引用的修改,相当于对目标的修改。
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
int a = 5;
int &r = a;
cout <<r <<" " << a<<endl;
r= 7;
cout <<r <<" " << a<<endl;
return 0;
}
输出结果:
5 5
7 7
2.引用和指针的差别:
1.指针是变量,可以把指针再次赋值指向别处,而引用是别名,在建立的时候必须初始化,并且不会再关联其他不同的变量
2.由于指针也是变量,所以可以有指针变量的引用,但void引用是不合法的。
int * a = NULL;
int *& r= a;
int b = 8;
r = &b;
3.引用的参数传递:传递引用给函数啊和传递指针给参数的效果是一样的。但是引用作为参数比指针有更清晰的语法。
例:实现两数交换
using namespace std;
void swap (int& x, int& y)
{
int temp;
temp = x;
x= y;
y =temp;
}
int main(int argc, char *argv[])
{
int a = 1;
int b = 2;
swap(a,b);
cout <<a <<" " <<b<<endl;
return 0;
}
例:按值传递,按引用传递和按指针传递
#include <iostream>
using namespace std;
void foo(int val)
{
val = 10;
}
void bar(int& val)
{
val = 10;
}
void zoo(int *pval)
{
*pval = 10;
}
int main(int argc, char *argv[])
{
int a = 1;
int b = 1;
int c = 1;
foo(a);
bar(b);
zoo(&c);
cout <<a <<" " <<b<<" "<<c <<endl;
return 0;
}
输出结果:a = 1,b= 10, c= 10;
foo中的value是按值传递,a的值相当于传递堆栈上的一个副本,函数传递传递结束只是对副本进行了修改,函数传递结束只是对副本进行了修改,在调用完foo后的a的值还是1
bar中value的传递是引用,对引用的修改和对原值修改是一样的
zoo中value的传递是指针,指针对值得修改,原值也会修改。
4.
4.使用引用和引用参数的意义
a. 函数只能返回一个值,如果程序需要返回两个值,解决办法之一是用引用给函数传递链各个参数,然后函数给目标函数注入正确的值
b.函数返回值时,要生成一个值的副本,而引用返回值的时候不需要生成副本,所以提高了性能。
注意:不要返回局部的引用:
int result = 0
int& func(int r) //ok,返回引用,result的值在函数的作用域之外
{
result = r * r;
return result;
}
int& func (int r)
{
int result = 0;
result = r * r;
return temp; //error,返回局部变量的引用和返回一个局部变量的指针的问题一样严重。
}