C++笔记 引用

能用引用,绝不用指针

一、引用的初始

1.引用是c++对c的扩展,也存在与其他编程语言,不是c++专有。

2.引用是给已有的变量取个别名。

int num=10;
int &a=num;//此处&不是取地址,而是标明a是引用变量,是num的别名。

3.引用后的a完全等价于num

​​​​​​

注意:

1.引用必须初始化。

2.引用一旦初始化 就不能修改

int num=10;
int &a=num;

int data=20;
a=data;//不是data别名为a 而是将data值赋值给a(num)

二、引用作用于数组

1、方式一:直接法

void test02(){

    int arr[3]={10,20,30};
    int (&my_arr)[3]=arr;
    cout<<my_arr[0]<<endl;

}

2、方式二:配合typedef

void test02(){

    int arr[3]={10,20,30};
    //用typedef 给数组类型 取个别名
    //ARR就是一个数组类型(有5个元素 每个元素为int类型)
    typedef int ARR[3];

    //my_arr就是arr的别名
    ARR &my_arr=arr;

    cout<<my_arr[0]<<endl;

}

三、引用在函数中的应用

引用作为函数的参数

1.传递参数时相对于指针,不用加&,较为方便

//值传递
void my_swap1(int a,int b)
{
    int tmp=a;
    a=b;
    b=tmp;
}
//指针,地址传递
void my_swap2(int *a,int *b)
{
    int tmp=*a;
    *a=*b;
    *b=tmp;
}
//引用,方便
void my_swap3(int &a,int &b)
{
    int tmp=a;
    a=b;
    b=tmp;
}


void test02(){
    int data1=10;
    int data2=20;
    cout<<"data1= "<<data1<<" data2= "<<data2<<endl;
    //my_swap1(data1,data2);
    //my_swap2(&data1,&data2);
    my_swap3(data1,data2);
    cout<<"data1= "<<data1<<" data2= "<<data2<<endl;

}

引用作为函数的返回值

int& my_data(void)
{
    static int num=20;
    return num;//函数返回啥变量 引用就是该变量的别名
    //函数的返回值是引用时 不要返回局部变量
}

/*
函数返回值其实就是:
int& mydata()=num;
就是给num取了个别名,然后下面
int &a=my_data();
就是给my_data()取了个别名a,所以a也是num的别名

*/

void test02(){
    int &a=my_data();//a是返回变量num的别名
    cout<<"a= "<<a<<endl;
}

//当函数返回值作为左值时,则返回类型必须是引用
void test03()
{
    my_data()=1000;//相当于把num修改成1000
}

四、引用的本质(仅了解)

int data=10;
int& a=data;//a就是data的别名
//编译器内存转换:int * const a=&data

a=100;//等价于data=100
//编译器内存转换://*a=100

五、指针的引用(仅了解)

#include "stdlib.h"
#include "string.h"
void my_str1(char **p_str)
{
    //p_str=&str
    *p_str=(char *)calloc(1,32);
    strcpy(*p_str,"hello world");
}

void my_str2(char *&my_str)
{
    //my_str是str的别名,等价于str
    my_str=(char *)calloc(1,32);
    strcpy(my_str,"hello world");

}


void test02(){
    char *str=NULL;
    //需求:封装一个函数 从堆区 给str申请一个空间 并赋值为"hello world"
    //my_str1(&str);
    my_str2(str);
    cout<<"str= "<<str<<endl;
    free(str);
}

 六、常引用

1.const引用的应用一般在函数的形参上,减少形参与实参的开销,使用const修饰的引用可以保护实参不被修改。 

typedef struct 
{
    int num;
    char name[32];
}STU;

void myPrint(const STU &tmp)
{
    //strcpy(tmp.name,"nacy");//err tmp有const修饰,不能修改
    cout<<"学号:"<<tmp.num<<"名字:"<<tmp.name<<endl;
}

void test02(){
    STU lucy={100,"lucy"};
    myPrint(lucy);
}

2.常量也可以用引用

const int &num=10;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值