前面说了内存四区和new操作符,现在来讲下引用
1.给一个简单的定义 引用就是给变量取别名
int a =100;
int &b= a;
a 和 b 是同一块内存
引用要注意两个问题
1.引用必须初始化
2.引用不能更
下面是测试代码:
#include <iostream>
using namespace std;
int main()
{
int a = 100;
int& b = a; //引用必须初始化
cout << "a=" << a << " b=" << b << endl;
int c = 200;
//int& b = c;//错误,引用不可以更改
b = c;//这不是更改引用,而是给变量b赋值
cout << "a=" << a << " b=" << b <<" c=" <<c<< endl;
}
运行结果:
2.引用作函数参数和函数返回值
之前大家应该都学过 交换两个变量值的方法
变量值改变的意义并不是值本身的问题,而是地址的问题
所以
swap(int *a,int *b)能够交换主函数传入两个变量的值
swap (int a,int b)不能交换,因为传进来的是两个值本身,swap函数中局部变量a,b的值会被修改,但是主函数中的则不会
了解了引用 可以用第三种方法 引用传递
swap(int& a,int& b) 因为是取别名,当然也是可以为本身的 相当于int& a=a;所以主函数中的a与swap函数里面的a,主函数中的b与swap函数里面的b共用同一块内存,swap中a与b的值交换了
当然主函数中的a b也交换了
代码里面就不重名了,重名是可以的大家可以去试试
void swap(int& a, int& b)
{
int temp = a;
a = b;
b = temp;
}
int main()
{
int x=100;
int y=200;
swap(x,y);
cout<<x<<" "<<y<<endl;
}
200 100
引用是可以做函数返回值的
1.不要返回局部变量
2.函数调用可以作左值
之前讲过,局部变量是在栈区的 会在函数结束后释放
所以返回局部变量用其他变量接受的时候,第一次可能会被编译器保留,但是之后就会被随机重置,就不试了,大家可以去试试
第二
函数调用是可以作左值的
下面代码段输出为100000
#include <iostream>
using namespace std;
int& test()
{
int a = 100;
return a;
}
int main()
{
int& b = test();//返回的是引用,用引用接收
test() = 1000000;
cout << b<< endl;
}
3.引用的本质和常量引用
引用的本质:
我们可以把引用看作是取别名,但是在C++中,引用是有更深一步的操作的
引用的本质的 指针常量
指针常量和常量指针相信大家都明白
指针常量是指针的指向不可变 指向空间的值可以被修改 如 int *const b=&a;
常量指针指针的指向可以改变 但是指向的空间的值不可以修改 如 int const *b=&a;
这里我们就可以解释开篇提出要注意的两个问题了
1.引用必须初始化 指针必须初始化,不然就是个野指针,是很危险的
2.引用不能更 int *const b=&a; 指针常量的指向是不可以变的
int &b=a ----------- int *constb=&a
b=100; -------------*b=100;
这是引用的实质,我们用的时候不需要去管这些,只需要知道用法就行
最后 一个 常量引用
这个的应用场景主要是作函数参数,防止形参被修改
比如说我我们只想打印传入变量的值 但不修改
#include <iostream>
using namespace std;
void printnum( const int & num)
{
cout << num << endl;
}
int main()
{
int a=10;
printnum(a);
}
如果我们直接int &num 那么我们修改num的值则会改变a;
加上const 变为只读 不能修改 从而防止误操作
分享到这里 谢谢大家