引用方法

左值引用 
1、格式:类型 &引用名=变量名; 
2、例如:

int i=9;
int &ir=i;//ir为i的别名,ir和i的值始终保持相同;
ir=20;//i=20;
i=10;//ir=10;
//其中ir和i为一体的,两个值始终相同。
  • 1
  • 2
  • 3
  • 4
  • 5

3、注意必须在定义时初始化,不能在定义完成后再给它赋值 
例:

int &i;//错误,因为没有在定义时初始化;
int &i=h;//正确;
  • 1
  • 2

4、引用只能引用变量,不能引用常量和表达式。


引用有两种方法,包括参数传递和参数返回值 
一、参数传递 
1、参数传递有三种方式 
(1)传值 
(2)传地址 
(3)传引用 
注意,其中(2)与(3)的效果相同,但是传引用更加简单


值传递 
无法交换两数值的代码

#include <iostream>

using namespace std;

void swap(int a,int b)
{
    int temp;
    temp=a;
    a=b;
    b=temp;
}
int main()
{
    int x=10;
    int y=5;
    swap(x,y);
    cout<<x<<" "<<y<<endl;
    return 0;
}
//不管是c语言还是c++中都不能用此种方法交换两数值
#include <stdio.h>
#include <stdlib.h>
void swap(int i,int j)
{
    int temp;
    temp=i;
    i=j;
    j=temp;
}
int main()
{
    int i,j;
    i=3,j=4;
    swap(i,j);
    printf("%d %d",i,j);
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38

指针传递

#include <iostream>

using namespace std;
void swap(int *a,int *b)//这里是*
{
    int temp;
    temp=*a;
    *a=*b;
    *b=temp;
}
int main()
{
    int x=10;
    int y=5;
    swap(&x,&y);//c++中把实参x的地址复制到形参a,将y的地址复制到形参b;//这里是&
    cout<<x<<" "<<y<<endl;
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

引用参数

#include <iostream>

using namespace std;
void swap(int &a,int &b)//这里是&
{
    int temp;
    temp=a;
    a=b;
    b=temp;
}
int main()
{
    int x=10;
    int y=5;
    swap(x,y);//a是实参x的引用,b是实参y的引用;//这里什么也没有
    cout<<x<<" "<<y<<endl;
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

二、函数返回值 
1、原型:返回类型 &函数名称(类型 变量名,类型 变量名,类型 变量名,等等) 
2、当一个函数返回引用时,实际返回了一个变量的内存地址 
例如:

int &g(int i,int j)
{return i+j;//错误,因为只能返回一个变量;}
但是
const int &g(int i,int j)
{return i+j;//正确,因为相当于int temp=i+j;
            //             return temp;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

3、当一个函数返回引用时,实际返回了一个变量的内存地址

int &g(int i,int j)
{
    int temp;
    temp=i+j;
    return temp;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
#include <iostream>

using namespace std;
int temp;//全局变量若未赋值,则初值为0;
int f1()
{
    return temp;
}
int *f2()//指针函数,返回的应为指针;
{
    return &temp;//地址与指针相对应;
}
int &f3()//返回值是引用函数;
{
    return temp;//返回的temp的引用(无名);
}
int main()
{
    int y=1;
    int x;
    x=f1();//正确,右值;
    f1()=y;//错误,左值;
    *f2()=y;//正确,相当于temp=y,其实是改变了temp的值;
    f3()=y;//正确,相当于temp=y,左值是temp的引用;
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

注意 
一般在定义函数的时候,例如int get(int &a,int &b,int c,int d);这里面加&号是因为要在自己定义的函数里面改变*a与b的数值*,但是c与d前面没有&号,说明在定义的函数里面没有改变其数值,只是调用了其数值。//也就是说当在一个函数里面改变某一个变量的值的时候要加&号,如果没有改变的话就不用加&号。 
例如:

void max_min(int &mmax,int &mmin,int a,int b,int c)
{
    mmax=max(a,b);
    mmax=max(mmax,c);
    mmin=min(a,b);
    mmin=min(mmin,c);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

void max_min(int &mmax,int &mmin,int &a,int &b,int &c)
{
    mmax=max(a,b);
    mmax=max(mmax,c);
    mmin=min(a,b);
    mmin=min(mmin,c);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

等同,因为在这个调用函数中,a,b,c的值没有改变,mmax,mmin的值改变了,没有改变的值前面不用加&号,但是要改变的值前面要加&号。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值