说明
引用
引用不是对象,他只是给已经存在的对象所起的另一个名字,因此你不能引用一个引用,只能引用已存在的对象。
可以把引用看作约束化的指针,它同样可以被传递,间接访问,但是更加安全,因为它只是对象的“小名”,就比如鲁迅和周树人的关系。引用虽然也地址相关,但只是内存块的别名。
指针
指针就很熟悉了,它本身就是一个变量,void*和T*类型的指针可以存储T类型对象的地址。因为是一个变量,可以被赋值。
const引用
const 声明定义的量是只读的常量,因此可以引用,但是引用也不能改变它只读的性质,同样的,不可以用普通引用去引用常量(或者常量的引用,其实也是常量)。
有一种值得讨论的情况:
就是形如:
double i = ;
const double &S = *i*i; //(1)
这时候编译器会有一个暂时变量用于保存3.14*i*i的计算结果
计作tmp那么语句(1)其实等效为:
const double tmp = *i*i;
const double &S = tmp;
并且这里的tmp也是只读的
定义
引用
int val1 = , val2 = ;
int &val1_ref = val1, other_val = val2;
//val1_ref是ref1的引用,other_val是另一个无关的int型的变量,只是被val2初始化了
指针
int i = ;
int *iptr = &i; //
(*iptr)--;
const引用
double i = ;
const double &r = i; //r是i的只读引用
const double &C = **r; //C是中间变量的常量引用
const double &S = *i*i; //同上,即使i变化S、C的值都不会变化
区别
definition
#include<iostream>
using namespace std;
int main()
{
int i = ;
//reference
int &i_ref = i;
//pointer
int *iptr = &i;
//const reference
const int &i_conref = i;
cout << "i = " << i << ", i_ref = " << i_ref <<endl;
i_ref--;
cout << "now i = " << i << ", i_ref = " << i_ref <<endl;
(*iptr)--;
cout << "now *iptr = " << *iptr << ", i_con-ref = " << i_conref <<endl;
return ;
}
compare
#include<iostream>
using namespace std;
int main()
{
double i = ;
const double &r = i;
double &ii = i;
const double &C = r*;
const double &S = i*i*;
cout << "r = " <<r<< " rr = " <<ii<<" C = "<<C<<" S = "<<S<< endl;
i++;cout << "r = " <<r<< " rr = " <<ii<<" C = "<<C<<" S = "<<S<< endl;
i++;cout << "r = " <<r<< " rr = " <<ii<<" C = "<<C<<" S = "<<S<< endl;
i++;cout << "r = " <<r<< " rr = " <<ii<<" C = "<<C<<" S = "<<S<< endl;
//point of reference
double const *tptr = &r;
cout << "point of i via reference r "<< (*tptr) << endl;
//point of tmpvarible
double const *sao = &C;
cout << "point of C "<< (*sao) << endl;
//(*sao)++; cout << "point of C "<< (*sao) << endl; // read-only
//reference of point
double *iptr = &i;
double *&iref = iptr;
(*iref)++;
cout << "now *tptr = " << *iptr << " pref = " << *iref << endl;
return ;
}
output as fellow:
[email protected]:~/script/cpp$ ./out
r = 1 rr = 1 C = 2 S = 2
r = 2 rr = 2 C = 2 S = 2
r = 3 rr = 3 C = 2 S = 2
r = 4 rr = 4 C = 2 S = 2
point of i via reference r 4
point of C 2
now *tptr = 5 pref = 5
参数传递
#include<iostream>
using namespace std;
void swap1(int *a, int *b)
{
(*a) = (*a) ^ (*b);
(*b) = (*a) ^ (*b);
(*a) = (*a) ^ (*b);
}
void swap2(int &a, int &b)
{
a = a ^ b;
b = a ^ b;
a = a ^ b;
}
int main()
{
int a = , b = ;
cout << "1 a = " <<a<<" b = "<<b<<endl;
swap1(&a,&b);
cout << "2 a = " <<a<<" b = "<<b<<endl;
swap2(a,b);
cout << "3 a = " <<a<<" b = "<<b<<endl;
return ;
}
reference
[1] c++ Primer
[2] http://www.cnblogs.com/Mr-xu/archive/2012/08/07/2626973.html
[3] http://blog.csdn.net/listening_music/article/details/6921608
[4] http://www.cnblogs.com/dolphin0520/archive/2011/04/03/2004869.html