引用
引用一个指针& 放在*的右边
void change (myclass *&p)
{
}
int &i=j 等价于 int *const i=j;
int a ;
int &b=a;//引用定义时必须初始化
//此时b就已经建立了对a的引用
引用
的本质上是为了方便程序员间接修改变量的程序编写,不需要使用指针,编译器在内部已经做了。
void fun(int &b)
{b=20;}
void main()
{
int a =10;
fun(a);//此时a已经改成了20,若是在C语言里面还要取地址,间接赋值,现在就不用了
}
引用很像指针,在定义时,C++编译器也是分配内存的,已一个常量指针类型建立内存
对比间接赋值的三个条件:
1、定义两个变量,一个实参一个形参
2、建立关联,将实参的地址传给形参p
3、*p形参去间接的修改实参的值
引用在实现上,只不过是把间接赋值成立的三个条件的后两个放到了一起
当实参传给形参的时候,只不过是C++编译器帮我们程序员手工取了一个实参地址传给形参引用。
C++引用使用难点:
当函数返回值为引用时
若返回栈变量,不能成为其他引用的初始值,不能做左值使用;可以成为其他变量的赋值,不是引用类型的。
若返回静态变量或全局变量,可以成为其他引用的初始值,既可以作为右值,也可以作为左值使用。
//当返回的是全局变量时,函数外部拿int或者int&都行。
//若返回的是局部变量,则只能用int类型去接
int a=100;
int &fun01(int &a)
{
a++;
return a;
}
void main()
{
int d=fun01(a);
cout<<"d:"<<d<<endl;//101
int &e=fun01(a);
cout<<"e:"<<e<<endl;//102
}
返回栈变量
# define _CRT_SECURE_NO_WARNINGS
#include "iostream"
using namespace std;
int & get()
{
int a = 10;
int &ra = a;
return ra;
}
void main()
{
int b = get();//此时打印的两个b均是正确的,因为当给一个变量赋值时,就直接吧那个变量赋值成10了。
//int &b = get();如果这儿赋值的是引用的话,最后一个输出的b会是乱码,第一个b是正常的,因为此时只是把内存回收了,但是还没有将内存内的值重新赋值
cout << b << endl;
cout << "abcdefg" << endl;;
cout << b << endl;
system("pause");
}