【cpp】引用、指针、const

说明

引用

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

指针

指针就很熟悉了,它本身就是一个变量,void*和T*类型的指针可以存储T类型对象的地址。因为是一个变量,可以被赋值。

const引用

const 声明定义的量是只读的常量,因此可以引用,但是引用也不能改变它只读的性质,同样的,不可以用普通引用去引用常量(或者常量的引用,其实也是常量)。

有一种值得讨论的情况:
就是形如:

double i = 1.0;
const double &S = 3.14*i*i;  //(1)

这时候编译器会有一个暂时变量用于保存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;  
//val1_ref是ref1的引用,other_val是另一个无关的int型的变量,只是被val2初始化了

指针

int i = 42;
int *iptr = &i; // 
(*iptr)--;

const引用

double i = 1.0;
const double &r =  i; //r是i的只读引用
const double &C = 2*3.14*r; //C是中间变量的常量引用
const double &S = 3.14*i*i; //同上,即使i变化S、C的值都不会变化

区别

definition


#include<iostream>
using namespace std;
int main()
{
    int i = 42;

    //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 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;

    //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 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值