引用和引用参数

背景:


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,返回局部变量的引用和返回一个局部变量的指针的问题一样严重。
}

猜你喜欢

转载自blog.csdn.net/pure_dreams/article/details/81217392
今日推荐