引用
1:引用本身不是一种数据类型,所以没有引用的引用,也没有引用的指针。
引用不是类型,定义引用在概念上不产生内存空间
所以 在引用之上的引用不存在
有空指针,无空引用。 不应有下面的引用声明,否则会有运行错误。
int &ri =NULL ;//毫无意义
2: 引用传递参数
传递引用给函数与传递指针的效果一样,传递的是原来的变量或对象,而不是在函数作用域内建立变量或对象的副本。
调用swap()函数的参数是x,y 。简单的传递变量而不是他们的地址。而事实上,传递的是他们的地址。
引用传递的内存布局与指针相仿,只是操作完全不同,每当使用引用时,C++就去求该引用所含地址中的变量值
void fn(int s)
{
//...
}
void fn(int & t)
{
//...
}
int main()
{
int a=5;
fn(a); // 不知道将要匹配哪一个函数
}
3: 函数返回值时,要生成一个值的副本。 而用引用返回值时,不生成值的副本.
float temp ; //全局变量
float fn1(float r)
{
temp=r*r*3.14;
return temp;
}
float & fn2(float r)
{
temp=r*r*3.14;
return temp;
}
int main()
{
float a=fn1(5.0);
float &b=fn1(5.0) ; // warning
float c=fn2(5.0);
}
这是一般的函数返回值方式,返回全局变量temp 值时,C++ 创建临时变量并将temp的值
复制给该临时变量.返回到主函数后,赋值语句a=fn1(5.0)把临时的值78.5复制给a;
float &b=fn1(5.0) ;
函数是以值方式返回的,返回时,复制temp的值给临时变量,返回到主函数后,引用
b以该临时变量来初始化,使得b成为该临时变量的别名。由于临时变量的作用域短暂,所以b
面临无效的危险
C++标准规定:临时变量或对象的生命期在一个完整的语句表达式结束后便宣告结束
所以引用b以后的值是个无法确定的值。
float c=fn2(5.0);
这种情况,函数fn2()返回一个引用,因此不产生任何返回值的副本。所以直接将变量temp返回给
主函数,主函数的赋值语句中的左值c直接从变量temp中得到复制,这样就避免了临时变量的产生。
当变量temp是一个用户自定义的类型时,这种方式直接带来了程序执行效率和空间利用的利益。
但要注意 fn2返回的引用 是可以作为一个左值进行计算的
如:fn2(5.0)=100;
利用这一特性 cout 和cin的操作符重载,使得可以连续cout和cin.
4 int &a=new int (2);
由于引用不是指针,直接从堆中获得的变量空间来初始化引用是错的
阅读(2090) | 评论(0) | 转发(0) |