10 - 引用

引用概念

C++中增加了引用的概念,引用可以看做是一个已定义变量的别名。引用的语法:Type& name = var;

void main()
{
    int a = 10; //c编译器分配4个字节内存。。。a内存空间的别名
    int &b = a;  //b就是a的别名。。。

    a =11; //直接赋值
    b  = 14; 

    printf("a:%d b:%d", a, b);
    system("pause");
}

 

引用做函数参数

//普通引用在声明时必须用其它的变量进行初始化,
//引用作为函数参数声明时不进行初始化

#include <iostream>

using namespace std;

struct Teacher
{
    char name[64];
    int age ;
};

void printfT(Teacher *pT)
{
    cout<<pT->age<<endl;
}

//pT是t1的别名 ,相当于修改了t1
void printfT2(Teacher &pT)
{
    //cout<<pT.age<<endl;
    pT.age = 33;
}

//pT和t1的是两个不同的变量
void printfT3(Teacher pT)
{
    cout<<pT.age<<endl;
   pT.age = 45; //只会修改pT变量 ,不会修改t1变量
}

void main()
{
    Teacher t1;
    t1.age = 35;

    printfT(&t1);

    printfT2(t1); //pT是t1的别名
    printf("t1.age:%d \n", t1.age); //33

    printfT3(t1) ;// pT是形参 ,t1 copy一份数据 给pT     //---> pT = t1
    printf("t1.age:%d \n", t1.age); //35
	
    cout<<"hello..."<<endl;    
    system("pause");
    return ;
}

 

引用的意义

引用作为其他变量的别名而存在,因此在一些场合可以代替指针。

引用相对于指针来说具有更好的可读性和实用性。

 

引用的本质

引用在C++中的内部实现是一个常量指针,Type& name == Type* const name

C++编译器在编译过程中使用常指针作为引用的内部实现,因此引用所占用的空间大小与指针相同。

从使用的角度来说,引用会让人误会其只是一个别名,没有自己的存储空间。这是C++为了实用性而做出的细节隐藏。

引用在实现上,只不过是把间接赋值成立的三个条件的后两步合二为一了。当实参传给形参引用的时候,只不过是C++编译器帮我们程序员取了一个实参地址,传给了形参引用。

当我们使用引用语法时,我们不用去关心编译器是怎么做的,当我们分析奇怪的语法现象时,我们才去考虑C++编译器是怎么做的。

 

函数返回值是引用

C++引用作为函数返回值时,如果返回的是栈变量,则不能成为其他引用的初始值,不能作为左值使用。如果返回的是静态变量或者全局变量,则可以成为其他引用的初始值,可以作为右值使用,也可以作为左值使用。

 

指针引用

#include <iostream>
using namespace std;

struct Teacher
{
    char name[64];
    int age;
};

int getTe(Teacher **myp )
{
    Teacher *p = (Teacher *)malloc(sizeof(Teacher));
	
    if (p ==NULL)
    {
        return -1;
    }
    memset(p, 0, sizeof(Teacher));
    p->age = 33;

    *myp  = p; 
    return 0;
}

//指针的引用而已
int getTe2(Teacher*  &myp)
{
    myp = (Teacher *)malloc(sizeof(Teacher));
    myp->age = 34;

    return 0;
}

void main333()
{
    Teacher *p = NULL;
    //getTe(&p);
    getTe2(p);

    printf("age:%d \n", p->age);
    system("pause");
}

 

常引用

使用变量初始化const引用

在C++中可以声明const引用,const引用让变量拥有只读属性。

int main()
{
    int a = 10;
    const int &b = a; 

    //int *p = (int *)&b;
    b = 11; //err
    //*p = 11; //只能用指针来改变了

    cout<<"b--->"<<a<<endl;
    printf("a:%d\n", a);
    printf("b:%d\n", b);
    printf("&a:%d\n", &a);
    printf("&b:%d\n", &b);
    system("pause");
    return 0;
}

使用字面量常量初始化const引用

void main()
{
    const int b = 10;
    printf("b:%d", &b);

    //int &a1 = 19; 如果不加const编译失败
    const int &a = 19;
    printf("&a:%d \n", &a);
    
    system("pause");
}
void main()
{
    //普通引用
    int a = 10;
    int &b = a;

    //常量引用 :让变量引用只读属性
    const int &c = a;  

    //常量引用初始化 分为两种
    //1 用变量 初始化 常量引用
    {
        int x = 20;
        const int& y = x;
        printf("y:%d \n", y);
    }

    //2 用常量 初始化 常量引用
    {
        //int &m = 10; //引用是内存空间的别名 字面量10没有内存空间 没有方法做引用
        const int &m = 10; 
    }
    cout<<"hello..."<<endl;
    system("pause");
    return ;
}

当使用常量(字面量)对const引用进行初始化时,C++编译器会为常量值分配空间,并将引用作为这段空间的别名。使用字面量对const引用初始化后,将生成一个只读变量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值