reference引用笔记----C++学习之路

来源:互联网 发布:数控车床如何编程 编辑:程序博客网 时间:2024/05/19 18:12

  1.代码例子:

int x = 0;int* p = &x;int& r = x;int x2 = 5;r = x2;int& r2 = r;
  2.代码分析:

可以直到再memory中x占有一个内存 【int x = 0;】

指针p也占有一个内存【int* p = x;】------>【int x = 0;】

引用r意思是我有一个变量r,她是一个reference,指针p和整数x都占有4个字节,

那么引用r占有多少个字节呢?引用是一种绑定,可以说r代表x。x与r都是0。所以r也是整数。

但是在编译器上引用是依靠指针来实现的。注意:引用一定要有初值。

有个区别就是,指针可以再变换,但是引用绑定之后可不能再变换。就像倒数第二行代码,r不是重新代表,

这个意思就是r绑定的x变成x2的value。

最后一行代码:r2绑定r,也就是绑定x。

  3.编译器上:

sizeof(r) == sizeof(x);

&x == &r;

另外:java中的所有变量都是reference。
从另外代码来清楚看到:

typedef struct Stag{    int a,b,c,d;} S;int main(){    double x = 0;    double* p = &x;    double& r = x;    cout<<sizeof(x) <<endl;    cout<<sizeof(p)<<endl;    cout<<sizeof(r)<<endl;    cout<<p<<endl;    cout<<*p<<endl;    cout<<x<<endl;    cout<<r<<endl;    cout<<&x<<endl;    cout<<&r<<endl;    S s;    S& rs = s;    cout<<sizeof(s)<<endl;    cout<<sizeof(rs)<<endl;    cout<<&s<<endl;    cout<<&rs<<endl;}
运行结果:

  4.reference的常见用途

可以说reference是一种很漂亮的指针,但是几乎再实际用途上,很伤会直接声明一个引用变量。

reference多半用在参数处理上。

假如我们声明三个函数:

void func1(Cls* pobj){ ...........}void func2(Cls obj) {............}void func3(Cls& obj) {..........}
调用的情况时:

Cls obj;func1(&obj);  1func2(obj);  2func3(obj);  3
2和3调用接口相同,但是2传递value会传得慢,3只需要传递一个指针就行了。

  5.用途第二点

先看代码:

double imag(const double& im) {....}double imag(const double im) {....}   //Ambiguity
这两行是不能够并存得,他们得签名是相同得,签名部分就是不含有return type。

如果这两个签名是不同得话,那么就会产生第四点中得2和3中,2和3得函数名是不同,而这里同名函数,如果

同时存在得话,那么编译器会不知道你想调用哪个,因为调用接口是一样得。

那么如果是这样得:

double image(const double& im) const { .....}double image(const double im) {...}
这样是能够共存得,因为const是再签名上得。




原创粉丝点击