A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© wuqiong 金牌黑马   /  2018-7-14 10:00  /  2030 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

引用可以理解为给变量起一个别名,主要用于传参,通过定义引用变量,可以不使用副本,直接使用原始数据。

引用变量

定义引用变量:

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来修饰引用后,可以使用常数和公式作用参数,但实际是创建了临时变量,并没有修改引用变量的值。

8 个回复

倒序浏览
回复 使用道具 举报
棒棒哒
回复 使用道具 举报
牛牛牛!
回复 使用道具 举报
奈斯,优秀
回复 使用道具 举报
回复 使用道具 举报
优秀,奈斯
回复 使用道具 举报
回复 使用道具 举报
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马