黑马程序员技术交流社区

标题: 【上海校区】C++学习16:引用 [打印本页]

作者: wuqiong    时间: 2018-7-14 10:00
标题: 【上海校区】C++学习16:引用
引用可以理解为给变量起一个别名,主要用于传参,通过定义引用变量,可以不使用副本,直接使用原始数据。

引用变量

定义引用变量:

int a;
int &b = a;//注意一定要初始化

这里的&不是取地址符,是引用的标符号,这里定义了a的一个引用b,a和b会指向相同的内存单元,有相同的值,而且使用方法都是相同的。也就是说,此时可以把b看做a,两者是一样的。

来看一个例子:

#include<iostream>
using namespace std;  

int main()
{
    int a = 1;
    int c = 2;
    int &b = a;
    cout << "a=" << a <<  "  地址:" <<&a
        <<endl << "b="<< b << "  地址:" << &b <<endl<<endl;

    a++;
    cout << "a=" << a <<  "  地址:" <<&a
        <<endl << "b="<< b << "  地址:" << &b <<endl<<endl;

    b++;
    cout << "a=" << a <<  "  地址:" <<&a
        <<endl << "b="<< b << "  地址:" << &b <<endl<<endl;

    b=c;//这里是赋值,将c的值赋给b,而不是将b改为c的引用
    cout << "a=" << a <<  "  地址:" <<&a
        <<endl << "b="<< b << "  地址:" << &b <<endl<<endl;
    system("pause");
}


运行结果如下:

a=1  地址:0015FAB8
b=1  地址:0015FAB8

a=2  地址:0015FAB8
b=2  地址:0015FAB8

a=3  地址:0015FAB8
b=3  地址:0015FAB8

a=2  地址:0015FAB8
b=2  地址:0015FAB8

请按任意键继续. . .

,可见,a和b的值和地址是完全相同的,修改a或b任意一个变量,另一个会随之改变。

引用传参

引用常被用于传参,通过定义引用变量,可以不使用副本,直接使用原始数据,这样可以代替传递指针。下面来看引用传参的例子:

#include<iostream>
using namespace std;  

void swap(int &i,int &j);

int main()
{
    int a = 1;
    int b = 2;
    cout << "a=" << a <<  "  地址:" <<&a
        <<endl << "b="<< b << "  地址:" << &b <<endl<<endl;
    swap(a,b);
    cout << "a=" << a <<  "  地址:" <<&a
        <<endl << "b="<< b << "  地址:" << &b <<endl<<endl;
    system("pause");
}

void swap(int &i,int &j)
{
    cout << "i=" << i <<  "  地址:" <<&i
        <<endl << "j="<< j << "  地址:" << &j <<endl<<endl;
    int temp = i;
    i = j;
    j = temp;
};

结果如下:

a=1  地址:003AFBC0
b=2  地址:003AFBB4

i=1  地址:003AFBC0
j=2  地址:003AFBB4

a=2  地址:003AFBC0
b=1  地址:003AFBB4

请按任意键继续. . .

可以看到,通过引用来传参,可以直接对原始数据进行修改,从而达到和传递指针一样的效果,而且操作起来更加直观方便。
注意此时swap()函数的传入参数必须是int型变量,如果传入int数或公式会报错,例如:

    swap(a,3);    //错误
    swap(a,b+3);  //错误
1
2
但如果将引用定义为const,就可以使用常数和公式了,例如:

#include<iostream>
#include<fstream>
using namespace std;  

void swap(const int &i,const int &j);

int main()
{
    int a = 1;
    int b = 2;
    cout << "a=" << a <<  "  地址:" <<&a
        <<endl << "b="<< b << "  地址:" << &b <<endl<<endl;
    swap(a,b+3);
    cout << "a=" << a <<  "  地址:" <<&a
        <<endl << "b="<< b << "  地址:" << &b <<endl<<endl;
    system("pause");
}

void swap(const int &i,const int &j)
{
    cout << "i=" << i <<  "  地址:" <<&i
        <<endl << "j="<< j << "  地址:" << &j <<endl<<endl;
};


结果如下:

a=1  地址:002CF790
b=2  地址:002CF784

i=1  地址:002CF790
j=5  地址:002CF6B8

a=1  地址:002CF790
b=2  地址:002CF784

请按任意键继续. . .

可以看到使用const来修饰引用后,可以使用常数和公式作用参数,但实际是创建了临时变量,并没有修改引用变量的值。


作者: wuqiong    时间: 2018-7-15 10:21

作者: 不二晨    时间: 2018-7-17 14:00
棒棒哒
作者: 小影姐姐    时间: 2018-7-18 10:46
牛牛牛!
作者: 不二晨    时间: 2018-7-18 11:13
奈斯,优秀
作者: 吴琼老师    时间: 2018-7-18 15:00

作者: 不二晨    时间: 2018-7-20 11:02
优秀,奈斯
作者: 摩西摩西OvO    时间: 2018-7-23 14:17

作者: 吴琼老师    时间: 2018-7-26 16:28





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2