引用的意义和使用
刚刚开始接触C++,当然第一个学到的知识点就是引用,但是好多同学根本分不清引用和指针的区别,更有甚者觉得指针就是引用,
引用就是指针. 今天我们就一起来看看他两个之间的区别帮我们分辨和理解他们.
引用不是定义一个新的变量,而是给一个已经定义的变量重新起一个别名。
定义的格式为: 类型 &引用变量名 = 已定义过的变量名;
引用的特点:
一个变量可取多个别名。
引用必须初始化。
引用只能在初始化的时候引用一次,不能改变为再引用其他的变量。
代码举例:
#include<iostream>
#include<windows.h>
using namespace std;
void TestReference1()
{
int a = 1;
int& b = a;
cout << "a:address->" << &a << endl;
cout << "b:address->" << &b << endl;
a = 2;
b = 3;
int& c = b; // 引用一个引用变量,别名的别名
c = 4;
}
int main()
{
TestReference1();
system("pause");
return 0;
}
看看结果呢:
引用不是定义一个新的变量而是给一个已经定义的变量重新起一个别名。他们地址都是一模一样的,
结果就是对这些话充分的论证。
const 引用:
void TestReference2()
{
intd1= 4;
const int& d2 = d1;
d1 = 5; // d1改变d2的值也会改变。
//d2 = 6; //不能给常量(不能被修改的量)赋值
const int d3 = 1;
const int& d4 = d3;
//int& d5 = d3;
const int& d6 = 5; //常量具有常性,只有常引用可以引用常量
doubled 7 = 1.1;
//int& d8 = d7; //d7是double类型,d8是int,d7赋值给d8时要生成一个临时变量
//也就是说d8引用的是这个带有常性的临时变量,所以不能赋值。
//这里其实d7为d8生成了一个强制类型转换成int的临时变量,所以不能赋值。
const int& d9 = d7;
}
引用作为参数:
如果形参为引用类型,则形参是实参的别名。
这个例子就是利用引用来交换值。
void Swap(int& left, int& right)
{
int temp = left;
left = right;
right = temp;
}
void TestReference2()
{
int a = 3;
int b = 8;
cout << "a:" << a << endl;
cout << "b:" << b << endl;
Swap(a, b);
cout << "a:" << a << endl;
cout << "b:" << b << endl;
}
int main()
{
TestReference2();
system("pause");
return 0;
}
还有一个需要提醒的:当不希望函数内改变参数x的值时,尽量使用常引用传参。
传值做返回值&传引用作为返回值
int& Add(int d1, int d2)
// int Add ( int d1 , int d2)
{
int ret = d1 + d2;
return ret;
}
void test()
{
int a = 3, b = 4;
int c = Add(a, b);
cout << "c:" << c << endl;
}
int main()
{
test();
system("pause");
return 0;
}
不要返回一个临时变量的引用。
如果
返回对象出了当前函数的作用域依旧存在
,则最好使用引用返回,因为这样更高效。
指针和引用的区别:
0) 指针是一个变量(变量就地址) 引用就是一个别名.
1) 指针不需要初始化 引用必须初始化
2) 指针指向后可以改变,引用初始化之后不会改变
3) 指针可以为空 引用不能为空.
4) 指针和引用的++ -- 意义不同.
5) sizeof 意义不同. 指针4字节 引用是这个内容的总大小.
6) 指针和引用在底层的组成是相同的. (详情参照汇编代码)
一点小建议:指针比引用更灵活,但是也更危险。使用指针时一定要注意检查指针是否为空。指针所
指的地
址释放以后最好置0,否
则可能存在野指针问题。
实际上引用可以做的事情指针都可以用,为什么引用还可存在于世上呢?
答案:用适当的工具做恰如其分的工作.
指针能够毫无约束地操作内存中的任何东西,尽管指针功能强大,但是非常危险.就像一把
刀,他可以用来砍树,裁纸,修指甲不确定性太高.
如果确实只是需要借用一下某个对象的别名,那么就用"引用",而不要用"指针",以免发生意外.比如说,一个人只需要一个证明,本来文件上盖上公章的印子就可以了,但是你把公章直接给他,那么他就获得了本不该有的权利.