引用

2.1 引用的基本使用

作用:给变量起名

语法:数据类型 &别名 = 原名

示例代码

# include <iostream>
using namespace std;

int main()
{
    //引用基本语法
    //数据类型 &别名 = 原名

    int a = 10;

    //创建引用
    int &b = a;
    b = 20;

    cout << "a = " << a << endl;
    cout << "b = " << b << endl;

    system("pause");
    return 0;

}

2.2 引用注意事项

说明

  • 引用必须初始化
  • 引用在初始化后,不可以改变

示例代码

# include <iostream>
using namespace std;

int main()
{
    int a = 10;

    //引用必须要初始化
    //int &b;       错误,引用必须要初始化
    int &b = a;
    //引用在初始化后,不可以改变
    int  c = 20;
    b = c;          //赋值操作,而不是更改引用

    cout << "a = " << a << endl;
    cout << "b = " << b << endl;
    cout << "c = " << c << endl;

    system("pause");
    return 0;
}

简单来说就是若b引用了a,那b就不能再作为c的引用了。要做a的别名就做a的别名,从一而终,不能再做其他变量的别名了。

2.3 引用做函数参数

作用:函数传参时,可以利用引用的技术让形参修饰实参。

优点:可以简化指针修改实参

示例代码

# include <iostream>
using namespace std;

void myswap1(int a, int b)
{
    int temp = a;
    a = b;
    b = temp;
    cout << "a = " << a << endl;
    cout << "b = " << b << endl;
}

void myswap2(int* a, int* b)
{
    int temp = *a;
    *a = *b;
    *b = temp;

}

void myswap3(int &a, int&b)
{
    int temp = a;
    a = b;
    b = temp;
}
int main()
{
    int a = 10;
    int b = 20;

    //myswap1(a,b);                 //值传递,形参不会修饰实参
    //myswap2(&a,&b);               //地址传递,形参会修饰实参的
    myswap3(a, b);                  //引用传递,形参会修饰实参的

    cout << "a = " << a << endl;
    cout << "b = " << b << endl;

    system("pause");
    return 0;

}

总结:通过引用参数产生的效果同按地址传递是一样的,引用的语法更清楚简单。

2.4 引用做函数的返回值

作用:引用是可以作为函数的返回值而存在的

注意:不要返回局部变量引用

用法:函数调用作为左值

示例代码

# include <iostream>
using namespace std;

//不要返回局部变量的引用
int& test01()                    //以引用的方式返回a,告诉编译器a要被引用了                
{

    int a = 10;                 //局部变量存放在四区中的栈区
    return a;

}

//函数的调用可以作为左值
int& test02()
{

    static int a = 10;                  //全局变量存放在四区中的全局区
    return a;

}

int main()
{ 
    int &ref = test02();                    //ref本身是a的别名
    cout << "ref = " << ref << endl;

    test02() = 1000;                        //如果函数的返回值是引用,这个函数调用可以作为左值

    cout << "ref = " << ref << endl;
    cout << "ref = " << ref << endl;

    system("pause");
    return 0;

}

2.5 引用的本质

本质:引用的本质在C++内部实现是一个指针常量

示例代码

# include <iostream>
using namespace std;

void func(int& ref)          // 引用一旦初始化,就不可以发生改变了
{
    ref = 100;              //ref是引用,转换为 *ref = 100

}

int main()
{
    int a = 10;

    //自动转换为 int * const ref = &a;   指针常量是指针指向不可以更改,也说明为什么引用不可以更改
    int& ref = a;
    ref = 20;       //内部发现ref是引用,自动帮我们转换为: *ref = 20;

    cout << "a = " << a << endl;
    cout << "ref = " << ref << endl;

    system("pause");
    return 0;

}

# include <iostream>
using namespace std;

int main()
{
    system("pause");
    return 0;
}

void setup()
{

}

void loop()
{

}

C++推荐引用技术,因为语法方便,引用本质是指针常量,但是所有的指针操作编译器都帮我们做了。

2.6 常量引用

作用:常量引用主要用来修饰形参,防止误操作。

在函数形参列表中,可以加const修饰形参,防止形参改变实参。

示例代码:

# include <iostream>
using namespace std;

//引用使用的场景,通常用来修饰形参
void showValue(const int& val)
{

    cout << "val = " << val << endl;
}

int main()
{
    //int &ref = 10;     引用本身需要一个合法的内存空间,因此这行错误
    //加入const就可以了,编译器优化代码,int temp = 10;const int &ref = temp;
    const int& ref = 10;

    //ref = 100;    //加入const之后不可以修改变量
    cout << ref << endl;

    //函数中利用常量引用防止误操作修改实参
    int  a = 10;
    showValue(a);

    system("pause");
    return 0;

}

易碎

易碎

我看到的今夜的星空,是几万年前的光,我眼中的你是此时的你!

0 条评论

发表回复

Avatar placeholder

您的邮箱地址不会被公开。 必填项已用 * 标注

网站ICP备案皖ICP备2024045222号-1