const int *const& p = &ci;的理解

来源:互联网 发布:ubuntu软件中心装fcitx 编辑:程序博客网 时间:2024/05/19 03:43
const int i =0;
const  int  *const&  p  = &i;
 

这样理解吧,&ival就像函数返回值一样,
建立一个临时对象,类型是int *,而C++的临时对象都是const的
所以&ival的完整类型是int *const;
这样一个 int *const的引用的类型是int * const&;
接着ival是const对象,
所以一个前置的const来说明
得到const int * const &

测试代码
int main()
{
        int i;
    int *p1 = &i;
    int *const& cri = &i;    //ok
//    int *& ri = &i;            //err,cannot convert from 'int *' to 'int *& ' ,A reference that is not to 'const' cannot be bound to a non-lvalue
    int *& ri = p1;

    const int ii = 0;
//    int *const&crii = ⅈ  //err,cannot convert from 'const int *' to 'int *const & ',Reason: cannot convert from 'const int *' to 'int *const '
    const int *const& crii = ⅈ    //ok
    const int *pp = ⅈ
    const int *&rii = pp;
    return 0;
}

回复人:taodm(taodm) ( 一星(中级)) 信誉:100 2006-12-28 8:58:05 得分:0     ?

引用必须加在(有名)变量身上。
&ival呢,是一个结果为指针类型的表达式,或者说,得到一个指针类型的临时变量(无名变量)。
C++于是补充规定:非const引用必须加在有名变量身上,const引用可以加在无名变量身上。

回复人:jixingzhong(瞌睡虫·星辰) ( 四星(高级)) 信誉:102 2006-12-28 9:29:01 得分:0     ?

const int *const(!!) &pi_ref=&ival;

请注意 !! 标注的 const,
它的作用是,
说明 pi_ref 这个引用是 常量的引用 !!

常量的引用,
表明其引用的对象是常量,
那么无法通过这个 引用 pi_ref 去修改 被引用的 &ival 的值
(因为是常量, 无法修改)

一个非常量可以被一个 常量引用 所引用,
这个是可以的, 因为操作权限是缩小的, 不会带来严重的问题;
但是反过来就不行, 可能会是非法操作 ~~
回复人:nsdcomputer() ( 一级(初级)) 信誉:100 2006-12-28 11:13:04 得分:0     ?
上面的代码不算!!

下面的结论表面上看是正确的,其实追究到内存,它是错误的!!!!!



临时变量如果被绑定给(cosnt)引用,那么它就将不再是临时变量了,它将拥有和那个引用同样长的生存期。



这是由于引用的特殊性!!
这里再罗嗦一下引用的实质:
引用是一个特殊的指针;它是要占用内存的;由于它的特性,我们可以把它看成变量的别名
请看:
3: int i=0;
00401028 mov dword ptr [ebp-4],0
4: int &p=i;
0040102F lea eax,[ebp-4]
00401032 mov dword ptr [ebp-8],eax


证明:


请看下面的例子:
#include<iostream.h>
int a=2;
void test()
{
const int &p=a;
cout<<"&p= "<<&p<<endl;
}
void test2()
{
test();
int kkk=2;
cout<<"&kkk= "<<&kkk<<endl;
}
void main()
{
test2(); //(1)
test(); //(2)
}

执行到语句(1)中的 test() 中的下面语句时
5: const int &p=a;
内存显示如下:
00401068 mov dword ptr [ebp-4],offset a (00428d50) //其中 ebp=0x0012FED4


执行到语句(1)中的
5: const int &p=a;
内存显示如下:
00401068 mov dword ptr [ebp-4],offset a (00428d50) //其中 ebp=0x0012FF2C

显然 两个dword ptr [ebp-4], 是不一样的!!!!
故得出结论: const int& 型的变量的生存周期与普通变量的是一样的!!!

为什么 6楼说的,表面上看是正确的呢?
这正是由于 引用 的特殊性!!!
例如: const int &p=a; (我提供的例子中的 test() 中的语句)
当你用cout 输出 &p 时,输出的是 全局变量a 的地址,而不是 p 的地址,这就是 引用 的特殊性;

故为了方便 我们可以像 6楼说的那样理解, 但是如果要精益求精的话,我建议最好想我这样理解

本人经验有限,如有错误,欢迎提出
原创粉丝点击