1.引用的概念及其基本应用
什么是引用
引用引入了对象的一个同义词,它不是定义一个新的变量,而是给一个已经定义的变量重新起一个别名。
引用定义的格式为:
类型 & 引用变量名 = 已定义过的变量名引用的特点
一个变量可取多个别名;
引用必须初始化;
引用只能在初始化时引用一次,不能改变为再引用其他的变量。
例:
1>引用:
int a = 2; //定义一个变量a
int &b = a; //为a引用一个别名b
cout << "a.address->" << &a << endl; //输出a的地址
cout << "b.address->" << &b << endl; //输出b的地址
a = 3; //改变a的值,输出查看 a 和 b 的值
cout << "a: " << a << endl;
cout << "b: " << b << endl;
b = 5; //改变 b 的值,输出查看 a 和 b 的值
cout << "a: " << a << endl;
cout << "b: " << b << endl;
b = 4;
int& c = b; //引用一个引用变量,别名的别名
c = 4;
cout << "a:" << a << endl;
cout << "b:" << b << endl;
cout << "c:" << c << endl;
这里说明在用引用时会因为任何一个变量名称内容改变时,其余的也都会改变。怎么样可以改变这种情况呢?我们使用const引用。
例:
2>const 引用:
int a1 = 2;
const int& a2 = a1;
a1 = 5; //a1改变,a2的值也会改变
cout << "a1:" << a1 <<endl;
cout << "a2:" << a2 << endl;
若改变a2 的值,则会报错:
这是因为d2为const引用,不能给常量(不能修改的量)赋值。但常引用可以引用常量。
例:
const int a3 = 3;
const int a4 = a3;
const int &a6 = 4; //常量具有常性,只有常引用可以引用常量
还有一种情况,如下:
这里报错是因为:a7是double类型,a8是int类型,a7赋值给a8时要生成一个临时变量,a8引用的时这个带有常性的临时变量,所以不能赋值。
所以将引用改为const引用
double a7 = 3.33;
const int& a8 = a7;
cout << "a8: " << a8 << endl;
3>引用作为参数
例:
void Swap(int &left, int &right)
{
int tmp = left;
left = right;
right = tmp;
}
int mainI()
{
int a = 6;
int b = 8;
cout << "a: " << a << " b:" << b << endl;
Swap(a, b);
cout << "Swap(a, b):" << endl;
cout<<"a:" << a << " b : " << b << endl;
return 0;
}
在这里应用引用传参,也修改了实参,此时,形参是实参的别名,没有另外开辟空间。用传地址的方式传参也可以起到修改实参的作用,但此时形参需额外开辟空间。
当不希望函数内改变参数的值时,尽量使用常引用传参。
4>传引用作为返回值
a)传值返回
int Add(int d1, int d2) //传值返回
{
int ret = d1 + d2;
return ret;
}
int main()
{
int a = 6;
int b = 8;
int c = Add(a, b);
cout << "a +b = " << c << endl;
return 0;
}
如果用int &c = Add(a,b);程序会报错,因为函数的返回值为临时变量,具有常性,应用conct修饰为:const int& c = Add(a,b);.
b)传引用返回
int& Add(int d1, int d2) //传引用返回
{
int ret = d1 + d2;
return ret;
}
int main()
{
int a = 6;
int b = 8;
int& c = Add(a, b);
cout << "a +b = " << c << endl;
Add(1,2);
return 0;
}
c)通过汇编查看传值返回和传引用返回:
结论:
- 不要返回一个临时变量的引用。
- 如果返回对象出了当前函数的作用域依旧存在,则最好使用引用返回,因为这样更高效。
引用和指针的区别联系
- 引用只能在定义时初始化一次,之后不能改变指向其他变量(从一而终),指针变量的值可变。
- 引用必须指向有效的变量,指针可以为空。
- sizeof指针对象和引用对象的意义不一样。sizeof引用得到的是所指向的变量的大小,而sizeof指针是对象地址的大小。
- 指针和引用的自增(++)、自减(–)意义不一样。指针的++ 加的是类型的大小,而引用的++是变量的++;–类似。
- 相对而言,引用比指针更安全。