引用(reference)

在c/c++中指针的作用基本都是一样的,但是c++增加了另外一种给函数传递地址的捷径,这就是按引用传递(pass-by-reference)

变量名实质是一段连续内存空间的别名,是一个标号(门牌号),程序中通过变量来申请并命名内存空间通过变量的名字可以使用存储空间。对一段连续的内存空间只能取一个别名吗?c++中新增了引用的概念,引用可以作为一个已定义变量的别名。

13.6.1 引用的定义

引用的本质:就是给变量取个别名

引用定义的步骤:

1、&别名
2、给哪个变量取别名,就定义该变量
3、从上往下整体替换

13.6.2 普通变量的引用

int a=10;
//需求:给变量a取个别名叫b
//定义的时候&修饰变量为引用,b就是a的别名(引用)
//系统不会为引用开辟空间
int &b=a;//引用必须初始化
//a和b代表同一空间内容
cou<<"a="<<a<<endl;
cout<<"b = "<<b<<endl;
cout<<"&a = "<<&a<<endl;
cout<<"&b = "<<&b<<endl;
//操作b等价操作a
b=100;
cout<<"a = "<<a<<endl;
cout<<"b = "<<b<<endl;

13.6.3 数组的引用

int arr[5]={10,20,30,40,50};
int n = sizeof(arr)/sizeof(arr[0]);
int (&myArr)[5] = arr;
int i=0;
for(i=0;i<n;i++)
{
cout<<myArr[i]<<" ";//10 20 30 40 50
}
cout<<endl;

13.6.4 指针变量的引用

int num = 10;
int *p = &num;
int* &myP = p;
cout<<"*p = "<<*p<<endl;//10
cout<<"*myP = "<<*myP<<endl;//10

13.6.5 函数的引用

void fun01(void)
{
cout<<"funo1"<<endl;
}
void (&myFun)(void)=fun01;
myFun();//fun01

13.6.6 引用作为函数的参数

函数内部可以通过引用操作外部变量

void swap01(int *p1, int *p2)
{
int tmp = *p1;
*p1 = *p2;
*p2 = tmp;
}
void swap02(int &x, int &y)
{
int tmp = x;
x = y;
y = tmp;
}
int main()
{
int a = 10;
int b = 20;
cout<<"a = "<<a<<", b = "<<b<<endl;//a = 10, b = 20
//swap01(&a, &b);
swap02(a, b);
cout<<"a = "<<a<<", b = "<<b<<endl;//a = 20, b = 10
}

引用的语法更加简单清楚:

  • 1) 函数调用时传递的实参不必加“&”符
  • 2) 在被调函数中不必在参数前加“*”符 引用作为其它变量的别名而存在,因此在一些场合可以代替指针。
  • 3) C++主张用引用传递取代地址传递的方式,因为引用语法容易且不易出错。

13.6.7 引用作为函数的返回值类型

1、不要返回普通局部变量的引用

int& getData(void)
{
int num = 10;
//不要返回局部变量的引用
return num;//返回num 函数调用的结果 就是num的别名
}
int main()
{
//b就是num的别名
int &b = getData();
}

2、返回值类型为引用可以完成链式操作

struct Stu
{
Stu& printStu(Stu &ob, int value)
{
cout<<value<<" ";
return ob;
}
};
int main()
{
Stu ob1;
ob1.printStu(ob1, 100).printStu(ob1, 200).printStu(ob1, 300);//100 200 300
}

13.6.8 常引用

1、给常量取别名,不能通过常引用修改内容

//int &a = 10;//err
const int &a = 10;//a就是10的别名
//a=100;//err
cout<<a<<endl;//10

2、常引用作为函数的参数;防止函数内部修改外部的值

void printInt(const int &a)
{
//a=200;//err
cout<<"a="<<a<<endl;
}
int main()
{
int num=100;
printInt(num);//a=100
}

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值