c++学习之引用

2引用

2.1引用的基本使用

作用:给变量起别名(类似于是指针常量【不能修改指向但是可以修改指向内存上的数据】)

引用只能是栈区或者堆区

区别在于int* const p = &a; 指针开辟内存给p用来存放a的地址,而引用不需要

指针是变成了两个内存而引用仍然是一个内存。

语法 数据类型 &别名 = 原名;(其实就是给a这块内存起一个别名)

通过别名和原名修改内存上的数据是一样的。

2.2引用的注意事项

引用必须初始化;

int &b;//错误的
int a = 10;
int &b = a;//引用在初始化后就不可以改变了
int c = 100;//不可以变成c的别名
b = c;//这是赋值操作而不是更改引用,把a上的数据变成了100;

2.3引用做函数参数

作用:函数传参时可以利用引用的技术让形参修饰实参

有点:可以简化指针修饰实参;

在函数传递中通过引用是将实参当作形参传进去的可以不开辟新的空间

引用做形参不需要初始化

swap(int &a,int &b)//不需要初始化因为已经有了(int &a = a,和int &b = b)传递时已经算是初始化了           这里是局部变量等价于main中的a,b;不开辟新的空间而是直接对原a,b内存上的数据进行改变;
{
    int tmp = a;
    a = b;
    b = tmp;
}
swap(int *a,int *b)//指针这里是形参在栈开辟新的空间
{
    int tmp = *a;
    *a = *b;
    *b = tmp;
}
int main(){
    int a = 10;
    int b = 20;
    swap(a,b);//这里其实已经初始化了
    //区别于指针的地址传递swap(&a,&b)函数定义格式是一样的
}

2.4引用做函数返回值

作用:引用是可以作为函数的返回值存在的

注意:不要返回局部变量的引用;

用法:函数调用作为左值

不要返回局部变量的引用;
int & test01(){
    static  int a = 10;//在栈中开辟保存,属于局部变量,前面加static来拉长其生命周期就可以输出;
    return a;
}
int main(){
    int &ref = test01();
    cout<<ref<<endl;//输出的是10;
}
//函数调用可以作为左值
//等号左边是左值
test02()//这里调用了函数 = 1000;

2.5引用的本质

本质是指针常量

int *const ref = &a
int & p = a;
cout<<p<<endl;
cout<<*ref<<endl;//两者输出数据是一样的

2.6常量引用

常量引用主要用来修饰形参,防止误操作

int &ref = 10;//不合法
const int &ref = 10;//合法
//编译器进行修改代码操作
// int tmp = 10;
//const int &ref = tmp;
ref = 20;//不合法原因
//加了const之后则值不可以修改
void show(const int &p);//既修饰形参又修饰实参,此时即便不小心修改了p也不会改变真正的值。
int main(){
    int a = 10;
    show(a);
    show(10);//这是不合法的因为10是在常量区的(全局区)
}

引用在函数中传递可以寄暗哨空间开辟

无论是指针传递还是值传递都需要开辟的另外的空间(指针是开辟四个字节内存而值传递是直接完全拷贝一个副本)

可是引用可以直接在原来的内存地址上对其进行修改;

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值