引用的概念,作为参数传递,和指针的区别,作为返回类型

    技术2022-07-14  69

    引用的概念和简单使用

    引用是C++语言新增的概念,用来为变量起别名。 主要作用: 1、作为函数参数 2、作为函数的返回值类型 C++是通过引用运算符&来声明一个引用的,在声明时,必须进行初始化。声明格式如下: 数据类型&引用名=已定义的变量名; EX1: int i=3; int &p=i; 这里,p为一个整形类型的引用,用整形变量i对它进行初始化,就可以看作是变量i的别名;换句话说,变量i和p占用内存的同一位置。也就是说,当p变化时i也会变化,i变化时p也会变化。可以理解为一个人有两个名字(可以理解为,一个是全名,另一个为外号),但是不管是用哪个名字做的事情,还是这个人做的。 说明: (1)在以上声明格式中,&不是取地址符,而是引用运算符,只在声明一个引用时使用,以后引用就像普通变量一样使用,不需要加上&。 (2)引用名为合法的用户自定义的标识符 (3)在声明一个引用的同时,如果不是作为函数的参数或返回值类型,就必须对它进行初始化,以明确该引用是哪一个的变量的别名,以后在程序中不可改变这种别名关系。 (4)引用只是某一个变量的别名,系统不为引用另外分配内存空间,与所代表的变量占用同一内存。 (5)并不是任何类型的数据都可以有引用,不能建立void引用、引用的引用、指向引用的指针、引用数组。 EX2:

    #include <iostream> using namespace std; int main() { int x = 3, y = 9; int &p = x;//定义一个引用p作为x变量的别名 cout << "x=" << x << " y=" << y << " p=" << p << endl; cout << "Address of x " << &x << endl; cout << "Address of y " << &y << endl; cout << "Address of p " << &p << endl; p = y;//相当于x=y,不是p改为y的别名 y = 999;//对y重新幅值不改变引用p的名字 cout << "x=" << x << " y=" << y << " p=" << p << endl; cout << "Address of x " << &x << endl; cout << "Address of y " << &y << endl; cout << "Address of p " << &p << endl; system("pause"); return 0; }

    引用作为参数传递

    在函数被调用时引用成为实在参数变量在被调用函数的别名,从而可以通过对引用的访问和修改达到对实在参数变量进行操作的效果,为对实在参数变量的访问和修改提供了简单方便的途径。 EX3:

    #include <iostream> using namespace std; void Swap1(int a1, int b1); void Swap2(int &a2, int &a2); void Show(int a, int b); int main() { int a = 3, b = 99; Show(a, b); Swap1(a, b); Show(a, b); Swap2(a, b);//调用函数,参数传递相当于执行了“int &a=a;”和“int &b=b;”使参数获得了初值 Show(a, b); system("pause"); return 0; } void Swap1(int a1, int b1) { int temp; temp = a1; a1 = b1; b1 = temp; } void Swap2(int& a2, int& b2)//并没有重新分配内存空间以存放实际参数的地址 { int temp; temp = a2; a2 = b2; b2 = temp; } void Show(int a, int b) { cout << "a=" << a << " b=" << b << endl; }

    Swap1(int a1,int b1)是通常的传值调用,所以并不会变换a,b的值。 Swap2(int& a2, int& b2)实参a,b分别引用a2和b2,所以对a2,b2的访问就是对a和b的访问,函数Swap2改变了main()函数中变量a和b的值。

    将形式参数设为引用参数,克服了不能通过值形式参数改变对应实在参数变量的缺陷,因为引用参数与对应实参变量共享内存

    引用和指针的区别

    引用和指针,都能实现修改第三方变量的值。 1、引用无需使用指针运算符“ * ”就可以得到和修改一个变量的值。 2、指针必须使用指针运算符“ * ”来得到或修改指针所指向的变量值。 EX4:

    #include <iostream> using namespace std; void Swap(int *a, int *b); int main() { int x = 3, y = 9; Swap(&x, &y); cout << "x=" << x << " y=" << y << endl; system("pause"); return 0; } void Swap(int* a, int* b)//系统要给a,b分配内存空间以及存放实际参数地址 { int temp; temp = *a; *a = *b; *b = temp; }

    虽然两种不同的形式参数都可以实现实际参数a,b的互换,但是引用的效率更高,语法更简单直观,因为系统需要给指针形式参数分配内存空间以及存放实际参数的地址。

    引用作为返回类型

    引用返回函数的原型声明形式: 类型名& 函数名(形式参数表); 调用引用返回函数可以作为: 1、独立函数语句; 2、表达是中的某一个运算对象 3、左值(注意:即赋值号左边的变量),这是引用作为返回值的函数的一个主要用法; EX5:

    #include <iostream> using namespace std; int& Fun(const int& x, int& y, int& z); int main() { int a = 1, b = 2, c = 3, d = 0; cout << "a=" << a << " b=" << b << " c=" << c << " d=" << d << endl; Fun(a, b, c)=20;/*这是引用返回的函数特有的调用方式,相当于c=20(注,函数的返回什么变量即等于其的赋值:不影响函数内部的运算)*/ cout << "a=" << a << " b=" << b << " c=" << c << " d=" << d << endl; system("pause"); return 0; } int& Fun(const int& x, int& y, int& z)//x不能修改 { z *= 4; y = x + y + z; return z; }

    (1)return 后面只能是变量,而不能是常量或表达式 (2)return后面变量的内存空间在本次函数调用结束后应当仍然存在,因此局部自动型变量不能作为引用的返回(比如int x) (3)return后面返回的不能是常引用

    Processed: 0.015, SQL: 9