c++中对引用的定义和说明:
引用变量是一个别名,也就是说,它是某个已存在变量的另一个名字。一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量,对引用的操作与对变量直接操作完全一样。
定义格式为:类型 &引用变量名 = 已定义过的变量名。
引用的特点:
①一个变量可取多个别名。
②引用必须初始化,只有别名是不能成立的。(如果不初始化,编译器出错警告)
③引用只能在初始化的时候引用一次 ,不能更改为转而引用其他变量。
如下示例:
#include <iostream>
using namespace std;
int main()
{
int a = 10;
int& b = a; // 给a起一个别名b
int c = 70;
b = c; //别名重新指向C??,那么a的值应该还是10,b值和c值 为70
cout << "a="<<a << endl;
cout << "b="<<b << endl;
cout << "c=" << c << endl;
system("pause");
return 0;
}
程序可以运行,好像引用可以修改为其他的值引用。实际执行结果
实际结果和想象中的并不一样,a并不是10,而是70。说明理解有问题,那么问题出在哪里?继续深究。
程序做如下变更:
#include <iostream>
using namespace std;
int main()
{
int a = 10;
int& b = a; // 给a起一个别名b
int c = 70;
b = c; //别名重新指向C,那么a的值应该还是10,b值和c值 为70
cout << "a="<<a << endl;
cout << "b="<<b << endl;
cout << "c=" << c << endl;
cout << "*********" << endl;
//假设b已经重新指向c,是c的别名,那么更改b的值,c应该同步改变
b = 18;
//更改后 再次输出,看结果
cout << "a=" << a << endl;
cout << "b=" << b << endl;
cout << "c=" << c << endl;
system("pause");
return 0;
}
观察结果
结果是,a 值改变了,c值并没有改变,说明没有改变原来绑定的别名。
程序中“b=c;”不能理解成:取消b是a的引用而将b作为c的引用。正确的理解应该是:利用引用b来改变它所指对象a的值,即相当于语句“b=70;”。
所谓的引用的重新赋值,应该是:
int a,b,c;
int &b=a;
&b=c;
这种是对引用b,改变了它的指定对象,一开始是a的引用,之后,又重新说明是c的引用,这种引用的重新赋值是不允许的 .编译无法通过。
常引用所引用的对象的值是不能更改的,即上述示例中若将语句“int& b=a;”更改为“const int& b=a;”,当出现“b=c ;”时出现编译时错误。
常引用一般用在函数参数中,最大的好处是可以传送地址提高效率,却不用担心变量被修改。
比如:int fun(const Obj &m)
如果不用const,则m可能被修改,如果不用引用,则对于结构类型的参数传递效率可能较低。