说明
引用
引用不是对象,他只是给已经存在的对象所起的另一个名字,因此你不能引用一个引用,只能引用已存在的对象。 可以把引用看作约束化的指针,它同样可以被传递,间接访问,但是更加安全,因为它只是对象的“小名”,就比如鲁迅和周树人的关系。引用虽然也地址相关,但只是内存块的别名。
指针
指针就很熟悉了,它本身就是一个变量,void*和T*类型的指针可以存储T类型对象的地址。因为是一个变量,可以被赋值。
const引用
const 声明定义的量是只读的常量,因此可以引用,但是引用也不能改变它只读的性质,同样的,不可以用普通引用去引用常量(或者常量的引用,其实也是常量)。
有一种值得讨论的情况: 就是形如:
double i =
1.0;
const double &S =
3.14*i*i;
这时候编译器会有一个暂时变量用于保存3.14*i*i的计算结果 计作tmp那么语句(1)其实等效为:
const double tmp =
3.14*i*i;
const double &S = tmp;
并且这里的tmp也是只读的
定义
引用
int val1 =
42, val2 =
666;
int &val1_ref = val1, other_val = val2;
指针
int i =
42;
int *iptr = &i;
(*iptr)--;
const引用
double i =
1.0;
const double &r = i;
const double &C =
2*
3.14*r;
const double &S =
3.14*i*i;
区别
definition
#include<iostream>
using namespace std;
int main()
{
int i =
42;
int &i_ref = i;
int *iptr = &i;
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 0;
}
compare
#include<iostream>
using namespace std;
int main()
{
double i =
1.0;
const double &r = i;
double &ii = i;
const double &C = r*
2;
const double &S = i*i*
2;
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;
double const *tptr = &r;
cout <<
"point of i via reference r "<< (*tptr) << endl;
double const *sao = &C;
cout <<
"point of C "<< (*sao) << endl;
double *iptr = &i;
double *&iref = iptr;
(*iref)++;
cout <<
"now *tptr = " << *iptr <<
" pref = " << *iref << endl;
return 0;
}
output as fellow:
pi@pi:~/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 =
1 , b =
2;
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 0;
}
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