天天看点

【cpp】引用、指针、const说明定义区别reference

说明

引用

引用不是对象,他只是给已经存在的对象所起的另一个名字,因此你不能引用一个引用,只能引用已存在的对象。

可以把引用看作约束化的指针,它同样可以被传递,间接访问,但是更加安全,因为它只是对象的“小名”,就比如鲁迅和周树人的关系。引用虽然也地址相关,但只是内存块的别名。

指针

指针就很熟悉了,它本身就是一个变量,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

下一篇: GWT

继续阅读