首页 > 编程语言 >C++中的引用&

C++中的引用&

时间:2024-06-06 13:02:04浏览次数:30  
标签:10 arr const int C++ 引用 ref

引用基本用法:

        引用是c++对c的重要扩充。在c/c++中指针的作用基本都是一样的,但是c++增加了另外一种给函数传递地址的途径,这就是按引用传递(pass-by-reference),它也存在于其他一些编程语言中,并不是c++的发明。

基本语法:

Type& ref = val;

注意事项:

  1. &在此不是求地址运算,而是起标识作用。
  2. 类型标识符是指目标变量的类型
  3. 必须在声明引用变量时进行初始化。
  4. 引用初始化之后不能改变。
  5. 不能有NULL引用。必须确保引用是和一块合法的存储单元关联。
  6. 可以建立对数组的引用。

普通变量的引用:

        代码如下:

    int a = 10;
    int &b = a;
    b = 100;

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

        上述代码相当于将 b 的地址也指向 a 的地址,所以 a 、 b 共用一块地址,后面改变b就相当于改变a,后面打印出来a、b都等于 100 。

函数的引用:

        最常见看见引用的地方是在函数参数和返回值中。当引用被用作函数参数的时,在函数内对任何引用的修改,将对还函数外的参数产生改变。当然,可以通过传递一个指针来做相同的事情,但引用具有更清晰的语法。

        如果从函数中返回一个引用,必须像从函数中返回一个指针一样对待。当函数返回值时,引用关联的内存一定要存在。

代码如下:

int &fun()      //引用函数名
{
    static int a = 20;
    return a;
}

        这里必须要用 static 关键字去固定 int a ,因为函数中的变量属于临时变量,在函数调用后会被清理,如果后续在对函数中的变量进行操作,会报错,这里使用 static 关键字去固定 int a,会避免这个问题的出现。

主main函数中:

int &mun = fun();
    fun() = 600;
    cout << "mun = " << mun << endl;

        可以看到函数fun() = 600,可以直接赋值,这是因为&fun后,相当于此时函数相当于是a这个变量,及返回的是变量 a ,而不是 20,所以可以进行直接赋值操作,此时相当于  a = 600,所以后面打印出来的也是600。

数组中使用:

        代码如下:

int arr[10];
    int(&arr_b)[10] = arr;
    for (int i = 0; i < 10;i++)
    {
        arr[i] = i;
        
    }
    for (int i = 0; i < 10; i++)
    {
        arr_b[i] = i;
        
    }
    for (int i = 0; i < 10; i++)
    {
        cout << "arr = " << arr[i] << endl;
    }
    for (int i = 0; i < 10; i++)
    {
        cout << "arr_b = " << arr_b[i] << endl;
    }

        在执行 

int(&arr_b)[10] = arr;

        后,相当于把数组的 arr_b的地址也指向了 arr 数组,和普通变量用法一样,所以后面对 arr_b 的操作 和对 arr 的操作结果、效果都一模一样。

指针的引用:

        代码如下:

    strunct1 stu;
    strunct1 *p = &stu;
    strunct1 *&sss = p;

    (*sss).age = 200;
    cout << "age = " << p->age << endl;

        我将 strunct1 *类型的 p ,重新用引用的方法定义了一个strunct1 *类型的 sss 指向 p 存在的地址,所以此时我操作 sss 指针 和 操作 p 指针的效果是一样的。

常量引用:

        常量引用的定义格式:

const Type& ref = val;

常量引用注意:

  1. 字面量不能赋给引用,但是可以赋给const引用
  2. const修饰的引用,不能修改。

代码如下:

    const int &num = 10;
    cout << "num = " << num << endl;

        可以看到,我在 const 后面的常量 进行了 &num = 10;这种操作:

 int &num = 10

        上面操作是不合法的,但前面加上 const 就可以实现。

引用的本质:

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

Type& ref = val; // Type* const ref = &val;

        c++编译器在编译过程中使用常指针作为引用的内部实现,因此引用所占用的空间大小与指针相同,只是这个过程是编译器内部实现,用户不可见。

//发现是引用,转换为 int* const ref = &a;
void testFunc(int& ref){
	ref = 100; // ref是引用,转换为*ref = 100
}
int main(){
	int a = 10;
	int& aRef = a; //自动转换为 int* const aRef = &a;这也能说明引用为什么必须初始化
	aRef = 20; //内部发现aRef是引用,自动帮我们转换为: *aRef = 20;
	cout << "a:" << a << endl;
	cout << "aRef:" << aRef << endl;
	testFunc(a);
	return EXIT_SUCCESS;
}

标签:10,arr,const,int,C++,引用,ref
From: https://blog.csdn.net/weixin_47378530/article/details/139496940

相关文章

  • C++课程设计杭电题目(中)
    2073.无限的路题目描述http://acm.hdu.edu.cn/showproblem.php?pid=2073http://acm.hdu.edu.cn/showproblem.php?pid=2073ProblemDescription甜甜从小就喜欢画图画,最近他买了一支智能画笔,由于刚刚接触,所以甜甜只会用它来画直线,于是他就在平面直角坐标系中画出如下的图形:......
  • namespace C++命名空间
    命名空间的概念最早出现在C++编程语言中,用于解决代码组织和命名冲突的问题。其设计初衷是为了让开发者能够更轻松地编写和维护大型的软件系统。来源C++是一种面向对象的编程语言,它继承了C语言的基本语法和特性,并在此基础上引入了一些新的概念和功能。命名空间是其中......
  • 信息学奥赛初赛天天练-20-完善程序-vector数组参数引用传递、二分中值与二分边界应用
    PDF文档公众号回复关键字:2024060512023CSP-J完善程序1完善程序(单选题,每小题3分,共计30分)原有长度为n+1,公差为1等升数列,将数列输到程序的数组时移除了一个元素,导致长度为n的开序数组可能不再连续,除非被移除的是第一个或最后之个元素。需要在数组不连续时,找出......
  • C++基础编程100题-004 OpenJudge-1.1-06 空格分隔输出
    更多资源请关注纽扣编程微信公众号http://noi.openjudge.cn/ch0101/06/描述读入一个字符,一个整数,一个单精度浮点数,一个双精度浮点数,然后按顺序输出它们,并且要求在他们之间用一个空格分隔。输出浮点数时保留6位小数。输入共有四行:第一行是一个字符;第二行是一个整数;......
  • 快速C++中的入门智能指针
    ✨前言✨......
  • VSCode(Visual Studio Code) C/C++ 开发环境 | MinGW无需输入代码 — 99.99%成功率(超详
    VisualStudioCodeC++六一马不停蹄更新中……参考资料:visualstudio|cppuninstall|vscode———————————————————————————————————————————————卸载VSCode【如没下跳转】-先下载下准备zip:MinGW32.zipMinGW真......
  • 「C++」论高精度
    大家好,我是Charzie。在编程领域,高精度计算是一个常见的问题。当标准的整型或浮点型无法满足我们的计算需求时,高精度计算就显得尤为重要。在C++中,虽然标准库没有直接提供高精度数据类型,但我们可以通过一些技巧和工具类来实现高精度计算。为什么需要高精度?在编程中,我们经常会遇到......
  • 习题整理《C++17从入门到精通》第二章-变量和基本类型
                                                             //复习用,如有错误,请指正1.下面哪些是不合法的变量标识符?为什么?@ohd      *zara    a2bc    move_name    a_123myname50  _......
  • 习题整理《C++17从入门到精通》第五章-复合类型:数组、指针和引用
                                                            //复习用,如有错误,请指正1.下面程序的输出是什么?#include<iostream>usingnamespacestd;intmain(){intx=10;int&ref=x;......
  • c++类中初始化列表的优点以及顺序问题
    1.使用初始化列表的好处效率:使用初始化列表可以避免不必要的拷贝操作,直接在对象构造时初始化成员变量,提高代码的执行效率。(因为变量的初始化分为初始化阶段和赋值阶段,在{}里面初始化属于赋值阶段)常量成员初始化:可以在初始化列表中对常量成员或引用的对象进行初始化,且只能在初......