网站/小程序/APP个性化定制开发,二开,改版等服务,加扣:8582-36016

引用是C++一个很重要的特性,顾名思义是某一个变量或对象的别名,对引用的操作与对其所绑定的变量或对象的操作完全等价,这篇文章主要给大家总结介绍了C++中引用的相关知识点,需要的朋友可以参考下

解释引用

首先我们先来看一个引用的例子

int main()
{
    int a = 10;
    int& Bin = a;
    cout << a << endl;
    cout << Bin << endl;
    cout << &a << endl;
    cout << &Bin << endl;
}


对于一个int型函数a,我们对a进行了引用,引用的新int函数叫Bin。 


由他们是同一个地址可以知道,引用其实就是对同一个地址的函数,换了一个新的叫法。

相当于《水浒传》中,李逵在江湖上人称黑旋风

那么这里int a就相当于李逵,而int&Bin就相当于黑旋风。

你使用李逵和黑旋风,他都会答应,这也就相当于起外号

如下:

int main()
{
    int a = 10;
    int& Bin = a;
    Bin += 10;
    cout << a << endl;
    cout << Bin << endl;
    cout << &a << endl;
    cout << &Bin << endl;
}

 


可以看到我们这里是对Bin进行操作,但是a的值也改变了。

同时我们也可以多个引用,可以给引用再引用(给外号再起外号)

int main()
{
    int a = 10;
    int& Bin = a;
    int& Tian = a;
    int& Wei = Bin;
    cout << a << endl;
    cout << Bin << endl;
    cout << Tian << endl;
    cout << Wei << endl;
    cout << &a << endl;
    cout << &Bin << endl;
    cout << &Tian << endl;
    cout << &Wei << endl;
}


可以看到值和地址还是相同。 


注意:引用必须同等类型

int a=10;
double&b=a;
这是错误的

引用的作用

非常经典的引用就是交换两个数的值。

这是我们c语言的交换,这里形参不改变实参

void test1(int a,int b)//a,b不改变,因为a,b的生命周期只在swap函数内,结束swap后a,b就消失,不改变实参
{
    int tmp = a;
    a = b;
   b = tmp;
}
int main()
{
    int a = 1;
    int b = 2;
    test1(a, b);
    cout << a << " " << b << endl;
}


然后我们学习了指针后,知道能直接交换地址 

void test2(int* a, int *b)//使用指针,交换地址实现数字变换
{
    int tmp = *a;
    *a = *b;
    *b = tmp;
}
int main()
{
    int a = 1;
    int b = 2;
    test2(&a,&b);
    cout << a << " " << b << endl;
}


然后这是引用,引用是实参的外号,我们这里修改,是对实参的直接修改 

void test3(int& a, int& b)//使用引用,a,b是实参的别名,相当于对实参的调用
{
    int tmp = a;
    a = b;
    b = tmp;
}
int main()
{
    int a = 1;
    int b = 2;
    test3(a, b);
    cout << a << " " << b << endl;
}


注意:我们这里的引用都必须是合法的空间 

Int &a = 10;//10并不是一个空间,只是一个数,这是错误的引用

 


 

关于局部变量的引用

int& test2()
{
    int b = 10;
    return b;
}
void test1()
{
    int &a = test2();
    cout <<  a << endl;
}
int main()
{
    test1();
}


按照常理,这里test2中的b出了test2应该作为局部变量被回收,但是 


我们依然能得到正确答案,这是因为编译器有对这种情况进行优化,但是仅限一次

如果我们这样

int& test2()
{
    int b = 10;
    return b;
}
void test1()
{
    int& a = test2();
    cout << a << endl;
    cout << a << endl;
    cout << a << endl;
    cout << a << endl;
}
int main()
{
    test1();
}


多调用几次打印 


就会发现除了第一次是正常的,其余都是乱码。

注:如果实在是要这样搞,就加上静态变量Static。

int& test2()
{
    static int b = 10;
    return b;
}
void test1()
{
    int& a = test2();
    cout << a << endl;
    cout << a << endl;
    cout << a << endl;
    cout << a << endl;
}
int main()
{
    test1();
}

 


评论 0

暂无评论
0
0
0
立即
投稿
发表
评论
返回
顶部