C++引用之用法详解

1、引用作为函数的参数

void my_swap1(int a,int b){
 int tmp = a;
    a = b;
    b=tmp;
}
void my_swap2(int *a,int *b)//a=&data1,b =data2;{
 int tmp = *a;
    *a = *b;
    *b = tmp;
}
void my_swap3(int &a, int &b)//a=data1,b=data2{
 int tmp = a;
    a = b;
    b= tmp;
}
void test04(){
 int data1 = 10,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;
}

2、引用作为函数的返回值

给函数的返回值 取个别名

//引用作为函数的返回值类型
int& my_data(void){
 int num = 100;
 return num;//err 函数返回啥变量 引用就是该变量的别名
 //函数的返回值是引用时  不要返回局部变量
}
int& my_data1(void){
 static int num = 200;
 return num;//ok
}
void test05(){
 //ret是别名 ret是num的别名
 int &ret = my_data();
 //cout<<"ret = "<<ret<<endl;//非法访问内存
 
 int &ret1 = my_data1();//ret1是num的别名
 cout<<"ret = "<<ret1<<endl;
}

当函数返回值作为左值 那么函数的返回值类型必须是引用

3、引用的本质

引用的本质在c++内部实现是一个指针常量. Type& ref = val; // Type* const ref = &val;

c++编译器在编译过程中使用常指针作为引用的内部实现,因此引用所占用的空间大小与指针相同,只是这个过程是编译器内部实现,用户不可见

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

4、指针的引用

#include<stdlib.h>
#include<string.h>
void my_str1(char **p_str)//p_str = &str
{
 //*p_str == *&str == str
    *p_str = (char *)calloc(1,32);
 strcpy(*p_str, "hello world");
 
 return;
}
void my_str2(char* &my_str)//char* &my_str = str;my_str等价str
{
    my_str = (char *)calloc(1,32);
 strcpy(my_str, "hello world");
 return;
}
void test07(){
 char *str = NULL;
 //需求:封装一个函数 从堆区 给str申请一个空间 并赋值为"hello world"
 //my_str1(&str);
    my_str2(str);
 cout<<"str = "<<str<<endl;
 free(str);
}

5、常引用

5.1、引出常引用

typedef struct
{
 int num;
 char name[32];
}STU;
void myPrintSTU1(STU tmp)//普通结构体变量作为形参 开销太大
{
 cout<<sizeof(tmp)<<endl;
 cout<<"学号:"<<tmp.num<<", 姓名:"<<tmp.name<<endl;
}
void myPrintSTU2(const STU &tmp)//STU &tmp=lucy;tmp是lucy的别名 tmp没有开辟独立空间
{
 //tmp.num = 2000;//err 因为tmp为常引用
 cout<<"学号:"<<tmp.num<<", 姓名:"<<tmp.name<<endl;
}
void test08(){
    STU lucy = {100,"lucy"};
 
 //需求:定义一个函数 遍历lucy成员(读操作)
    myPrintSTU2(lucy);
}

5.2、常量引用

void test09(){
 //给常量10取个别名 叫num
 //int &针对的是int ,10是const int类型
 //const int 针对的是const int, 10是const int类型
 const int &num = 10;
 
 cout<<"num = "<<num<<endl;//10
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值