标签:
这个写的很不错
http://www.cnblogs.com/Mr-xu/archive/2012/08/07/2626973.html
什么叫引用?
引用就是对某对象的另一个名字。
主要用途:
为了描述函数的参数和返回值,特别是运算符的重载。
用法:
X var;
X& r = var;
那么r是对象var的一个引用,而&在此处是作为引用的标识符而不是区地址。
特点:
(1)引用在创建的时候必须进行初始化,以确保引用会指向某个对象。
int i = 1;
int& r1 = i; //正确:r1被初始化
int& r2; //错误:r2没有被初始化
extern int& r3; //正确:r3在别处被初始化了
(2)所有对引用的操作,都可以看成是对被引用的对象执行的。
void g()
{
int ii = 0;
int& rr = ii;
rr++; //实际上是执行了ii++
int* pp = &rr; //pp指向了ii
}
因此在对应用进行操作时完全可以把引用替换为被引用的对象。
(3)一个引用的值在初始化之后就不可能改变了,它总是引用它初始化所指的那个对象,至死不渝。
(4)可以通过&r来获取r所指对象的地址。
(5)引用本身并不占有存储单元,有时候编译器可以通过优化去掉引用,使得在执行时根本不存在任何表示引用的东西。
(6)对于T&这种引用,属于变量引用,被引用的类型必须是T的左值,而对于const T&是常量引用,的初始式不必是一个左值,甚至可以不是类型T的,此时:
[1]首先需要将该类型到T类型进行隐式转换;
[2]随后将结果存入一个类型为T的临时变量;
[3]最后将这个临时变量作为初始式的值。
double& dr = 1; //错误,要求左值
const double& cdr = 1; //正确
对于初始化的解释是
double temp = double(1); //首先建立一个具有正确值的临时变量
const double& cdr = temp; //用临时变量作为cdr的初始值
这种保存引用初始式的临时变量将会一直存在,直到这个引用的作用域结束。
(7)需要区分对变量的引用和对常量的引用,常量引用是不能通过引用对目标变量进行修改的,从而使被引用的目标称为const,达到一定的安全性。
string foo();
void bar(string& s);
那么下列的表达式将是非法的:
bar(foo());
bar(“hello world”);
因为foo()和”hello world”串都会产生一个临时对象,而在C++中,这些临时对象都是const类型,上面表达式试图将const类型对象转为非congst类型对象,是非法的。
(8)可以通过引用来描述一个函数参数,使该函数能够改变传进来的该参数的值。
void increment(int& aa) { aa++; }
void f()
{
int x = 1;
increment(x); //x = 2
}
为了提高程序的可读性,应该避免让函数去修改它们的参数。相反应该让函数明确地返回一个值,或者明确要求一个指针参数:
int next(int p) { return p+1; }
void incr(int* p) { (*p)++; }
void g()
{
int x = 1;
increment(x); //x = 2
x = next(x); //x = 3
incr(&x); //x = 4
}
将引用作为参数传递进去将会,使得人们强烈感受到参数将被修改。
(9)引用还可以用于定义一些函数,使它们既可以被用于赋值的左边也可以用于右边。
(10)不能给数组建立引用,因为数组是若干元素组成的集合。
引用作为返回值
引用作为返回值需要在函数名前加&
引用作为返回值最大的好处就是内存中不产生被返回值的副本。
#include <iostream.h>
float temp;
float fn1(float r);
float &fn2(float r);
float fn1(float r)
{
temp = (float)(r*r*3.14);
return = temp;
}
flaot& fn2(float r)
{
temp = (float)(r*r*3.14);
return temp;
}
void main()
{
float a = fn1(10.0);
float &b = fn1(10.0);
float c = fn2(10.0);
float &d = fn2(10.0);
cout << a << c << d;
}
不能返回局部变量的引用,主要是因为局部变量会在函数返回后被销毁,因此被返回的引用就成了无所指的引用,使程序进入未知状态。
不能返回函数内部new分配的内存引用,虽然不存在被动销毁的问题,对于这种情况(返回函数内部new分配内存的使用),又面临其他尴尬局面,例如函数返回的引用只是作为一个临时变量出现,而没有被赋予一个时间的变量,那么这个引用所指向的空间就无法释放,造成memory leak。
可以返回类成员的引用,但最好是const,主要是当对象的属性与某种业务关联时,其赋值常常与某些其他的属性或者对象的状态有关,如果获得了非常量的引用则会导致单纯赋值破坏业务规则的完整性。
引用与一些操作符重载,这还是与引用可以作为左值有关。
引用和多态
标签:
原文地址:http://www.cnblogs.com/tuhooo/p/5377406.html