本文共 1443 字,大约阅读时间需要 4 分钟。
c++中引用就是一个常指针,其也占用内存空间。
1)引用在C++中的内部实现是一个常指针
Type& name 《-》Type* const name
2)C++编译器在编译过程中使用常指针作为引用的内部实现,因此引用所占用的空间大小与指针相同。
3)从使用的角度,引用会让人误会其只是一个别名,没有自己的存储空间。这是C++为了实用性而做出的细节隐藏
具体点:如下:
1)引用在实现上,只不过是把:间接赋值成立的三个条件的后两步和二为一
(简介赋值的三个条件: 1定义两个变量 (一个实参一个形参) 2建立关联 实参取地址传给形参 3 *p形参去间接的修改实参的值)
//当实参传给形参引用的时候,只不过是c++编译器帮我们程序员手工取了一个实参地址,传给了形参引用(常量指针)
如下图所示,c++编译器会把左边的代码翻译成右边的。
2)当我们使用引用语法的时,我们不去关心编译器引用是怎么做的
当我们分析奇怪的语法现象的时,我们才去考虑c++编译器是怎么做的。
详细点就是看下面的代码:
#includeusing namespace std;//1 第一点 单独定义的引用时,必须初始化;说明很像一个常量void main1(){ // const int c1 = 10; int a = 10; int& b = a; //b很想一个常量 printf("&a:%d \n", &a); printf("&b:%d \n", &b); //===> a 和 b就是同一块内存空间的门牌号,a和b的地址是一样的,说明引用b就是a的别名 cout << "hello..." << endl; system("pause"); return;}//2 普通引用有自己的空间吗? 有 struct Teacher{ char name[64]; //64 int age; //4 int& a; //4 0 //很像指针 所占的内存空间大小 int& b; //4 0 };//3 引用的本质void modifyA(int& a1){ a1 = 100;}void modifyA2(int* const a1){ *a1 = 200; //*实参的地址 ,去间接的修改实参的值 }void main(){ int a = 10; //1 modifyA(a); //指向这个函数调用的时候,我们程序员不需要取a的地址 printf("a:%d \n", a); //输出100 // a = 10; modifyA2(&a); //如果是指针 需要我们程序员手工的取实参的地址 printf("a:%d \n", a); //输出200 printf("sizeof(Teacher):%d \n", sizeof(Teacher)); //输出76,说明普通引用有自己的内存空间 system("pause");}void modifyA3(int* p){ *p = 200; //*p 3*p形参去间接修改实参的值}//间接赋值void main11(){ int a = 10; int* p = NULL; //间接赋值成立的三个条件 1 定义两个变量 p = &a; *p = 100; { *p = 200; } modifyA3(&a); //2 建立关联}// 123 写在一块// 12 3//1 23
转载地址:http://rqzmi.baihongyu.com/