【C++基础06】引用本质的探究
2016-01-13 10:35
489 查看
void main() { //const int c1; 报错 因为常量必须初始化 int a = 10; int &b = a; //一般引用 的声明也必须 初始化 所以很像一个常量 //两者打印出来的地址是一样的 ==》说明a和b都是同一块内存空间的别名 门牌号 printf("%d",&a); printf("%d", &b); cout << "hello!" << endl; system("pause"); return; }
struct Teacher { char name[64]; //64 int age;//4 //语法通过 占不占内存 double &a; //4 //很像指针所占的内存空间大小 int &b;//4 }; //普通引用占内存空间 而且和指针所占的内存空间是一样的 void main102() { printf("%d\n",sizeof(Teacher)); //结果是76 说明占字节 cout << "hello!" << endl; system("pause"); return; }
//引用的本质
//引用在c++内部实现是一个常量指针 Typpe *const name
//c++编译器在编译过程中使用常指针作为引用内部的实现 因此引用所占的空间大小与指针相同
//在使用过程中 引用会让人误会是一个别名 没有内存空间 这是细节隐藏
int midfyA(int &a1) { a1 = 10; return 0; } //a1的内部其实是这样的 int midfyA1(int *const a1) { *a1 = 100; return 0; } void main103() { //char const *p; int a = 1; midfyA(a); //执行这个函数调用时 我们程序员不需要取a的地址 midfyA1(&a);//如果是指针 需要我们手工取实参的地址 cout << "hello!" << endl; system("pause"); return; }
1)引用在C++中的内部实现是一个常指针
Type& name çèType*const name
2)C++编译器在编译过程中使用常指针作为引用的内部实现,因此引用所占用的空间大小与指针相同。
3)从使用的角度,引用会让人误会其只是一个别名,没有自己的存储空间。这是C++为了实用性而做出的细节隐藏
间接赋值成立的三个条件:
1定义两个变量(一个实参一个形参)
2建立关联实参取地址传给形参
3*p形参去间接的修改实参的值
引用结论:
1)引用在实现上,只不过是把:间接赋值成立的三个条件的后两步和二为一
//当实参传给形参引用的时候,只不过是c++编译器帮我们程序员手工取了一个实参地址,传给了形参引用(常量指针)
2)当我们使用引用语法的时,我们不去关心编译器引用是怎么做的
当我们分析奇怪的语法现象的时,我们才去考虑c++编译器是怎么做的