引用的本质分析

第一点:首先我们知道,引用(&)是C++用一个特有的概念,它的意思就是对一个变量取别名,操作变量的别名就相当于操作变量自己本身,例如:int a=1;int& b=a;然后对b操作就是对a进行操作,对a进行操作就是对b进行操作。是不是感觉有点像C语言中指针的意思在里面呢?其实C++中引用的本质就是指针,引用在C++的内部实现就是一个常量指针。int& p <-->int* const p 其中p引用,在C++编译器的内部实现就是右边的等价形式。其中p是一个指针,p的值不能改变,但是指针p所指向的内容可以改变,比如*p=3没错,但是p=NULL会报错。怎么样证明C++的引用的本质就是指针呢??

第二点代码验证:

引用的本质分析_第1张图片

在g++编译器中,把一个引用放在结构体中,然后输出这个结构的大小的时候发现,结构体的大小为4字节。

 

 

#include 

struct TRef
{
     char* before;
     char* middle;
     char* after;
};

int main()
{
    char a='a';
    char b='b';
    char c='c';
    
    TRef ref={&a,&b,&c};
    
    // 上述结构体的等价写法
    // ref.a=&a;
    // ref.b=&b;
    // ref.c=&c;
    
    
    printf("sizeof(TRef)=%d\n",sizeof(TRef));
    printf("sizeof(ref.before)=%d\n",sizeof(&ref.before));
    printf("sizeof(ref.after)=%d\n",sizeof(&ref.after));
    
    printf("ref.before=%p\n",ref.before);
    printf("&ref.r=%p\n",ref.r);
    printf("ref.after=%p\n",ref.after);
    
    printf("&ref.before=%p\n",&ref.before);
    printf("&ref.r=%p\n",&ref.r);
    printf("&ref.after=%p\n",&ref.after);
        
    return 0;
}
运行结果如图所示:
sizeof(TRef)=12
sizeof(ref.before)=4
sizeof(ref.after)=4
ref.before=0xbfc1bbef
&ref.r=0xbfc1bbee
ref.after=0xbfc1bbed
&ref.before=0xbfc1bbe0
&ref.r=0xbfc1bbe4
&ref.after=0xbfc1bbe8

然后把上述代码稍微改动一下,得到下面的结果:

#include 

struct TRef
{
     char* before;
     char& middle;
     char* after;
};

int main()
{
    char a='a';
    char b='b';
    char c='c';
    
    TRef ref={&a,b,&c};
    
    // 
    // ref.a=&a;
    // ref.b=&b;
    // ref.c=&c;
    
    
    printf("sizeof(TRef)=%d\n",sizeof(TRef));
    printf("sizeof(ref.before)=%d\n",sizeof(&ref.before));
    printf("sizeof(ref.after)=%d\n",sizeof(&ref.after));
    
    printf("ref.before=%p\n",ref.before);
    printf("&ref.r=%p\n",&ref.middle);
    printf("ref.after=%p\n",ref.after);
    
    printf("&ref.before=%p\n",&ref.before);
    //printf("&ref.r=%p\n",&ref.middle);
    printf("&ref.after=%p\n",&ref.after);
        
    return 0;
}

sizeof(TRef)=12
sizeof(ref.before)=4
sizeof(ref.after)=4
ref.before=0xbff7882f
&ref.r=0xbff7882e
ref.after=0xbff7882d
&ref.before=0xbff78820
&ref.after=0xbff78828

1.根据上述3个验证程序,我们可以得到在C++中引用的本质就是指针常量。

2.C++编译器在编译程序的过程中用常量指针作为引用的内部实现,因此引用所占用的内存空间的大小与指针相同。

3.是使用者的角度,引用只是一个别名,C++为了实用性隐藏引用的存储空间这一细节。

4.C++中的引用可以大对数的情况下代替指针的使用,但是并不是所有的情况,比如在一个函数中返回一个局部变量的引用,这个时候引用的本质就会被“暴露”出来了,哈哈。

 

 

你可能感兴趣的:(#,经典C++深度剖析,C++,指针,引用本质)