引用并不产生对象的副本,仅仅是对象的同义词。因此,当下面的语句执行后:
int x;
int & refx=x;
x = 12;
refx和x都具有12的值。
引用必须在定义时马上被初始化,因为它必须是某个东西的同义词。你不能先定义一个引用后才初始化它。
引用的一个重要作用就是作为函数的参数类型。C/C++的函数参数是传值的,如果有大对象(例如一个大的结构)需要作为参数传递的时候,以前的(C语言中)方案往往是指针,因为这样可以避免将整个对象全部压栈,可以提高程序的效率。但是现在(C++中)又增加了一种同样有效率的选择,就是引用。
如果一个函数返回了引用,那么该函数的调用也可以被赋值。
double &max(double &d1,double &d2)
{
return d1>d2?d1:d2;
}
int main()
{
double dval1 = 12.0,dval2 = 20;
max(dval1,dval2) += 24;
cout<<dval2<<endl;
return 0;
}
引用作为返回值的时候,有一些规则必须遵守。这些规则包括:
不能返回局部变量的引用。主要原因是局部变量会在函数返回后被销毁,因此被返回的引用就成为了“无所指”的引用,程序会进入未知状态。
不能返回函数内部new分配的内存的引用。例如,被函数返回的引用只是作为一个临时变量出现,而没有被赋予一个实际的变量,那么这个引用所指向的空间(由new分配)就无法释放,造成内存泄露。
可以返回类成员的引用,但最好是const。
常量引用
用这种方式声明的引用,不能通过引用对目标变量的值进行修改,从而使引用的目标成为const,达到了引用的安全性。
int getNumber(const MyClass &mc)const
{
return mc.money;
}
这样做的好处是其中的mc类对象既不产生副本的拷贝,由于是常量引用,所以也不用担心失误把mc中的某个数据意外修改了。
引用与指针有很大的区别,指针是个变量,可以把它再次赋值成指向别处的地址,但是建立引用时必须初始化,并且决不会再关联其他的任何变量。