c++ (2)
1.引用
- 引用是变量的别名
- 单独定义引用时,必须初始化;说明很像一个常量;
- b是a的同一块内存地址的别名;

- 问:引用是否占用内存空间?
答:会占用内存空间;下面程序最后显示的结果是76;
1 #include <iostream> 2 using namespace std; 3 4 struct Teacher { 5 char name[64]; 6 int age; 7 8 int &a; //很像指针占用的内存空间大小,跟类型没有关系,即使是double类型的指针也是占用4个字节 9 int &b; 10 }; 11 12 void main() 13 { 14 printf("sizeof(Teacher):%d \n",sizeof(Teacher)); 15 system("pause"); 16 return; 17 18 }
结果:
1 sizeof(Teacher):76 2 请按任意键继续. . .
1.2 引用的本质
- 引用的本质:在c++引用就是常量指针 ,c++程序员不必再像c程序员使用指针一样还需要取地址;

- 间接赋值是指针存在的最大意义:

形参间接的修改实参的值,因此有了接口这一层,完成对函数的封装;


1.3 引用的难点
当函数的返回值作为引用的时候是个难点;
1.3.1 当返回基本数据类型
1.3.2 (指针的知识,不是新知识)函数参数二级指针做内存输出示意图
非常重要,做模块的封装


1.3.3 指针做引用
1 // dm02.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 2 // 3 //demo1:二级指针的使用; 4 //demo2:指针的引用 5 6 #include <iostream> 7 #include "stdio.h" 8 #include "string.h" 9 10 using namespace std; 11 12 struct Teacher { 13 int age; 14 char name[64]; 15 }; 16 17 //二级指针,使用二级指针的三个条件 18 int getTeacher(Teacher ** p) { 19 Teacher *tmp = NULL; 20 21 if(p == NULL) 22 { 23 return -1; 24 } 25 26 tmp = (Teacher*)malloc(sizeof(Teacher)); 27 if (tmp == NULL) { 28 return -2; 29 } 30 31 tmp->age = 33; 32 //p是实参地址,*实参的地址间接的修改实参的值 33 *p = tmp; 34 } 35 36 //指针的引用 37 int getTeacher2(Teacher* &t) { 38 //给t赋值相当于给main函数中的pt1赋值; 39 t = (Teacher*)malloc(sizeof(Teacher)); 40 if (t == NULL) { 41 return -1; 42 } 43 44 t->age = 37; 45 } 46 47 48 49 //释放不用的指针 50 void freeTeacher(Teacher *t) 51 { 52 if (t==NULL) { 53 return; 54 } 55 56 free(t); 57 } 58 59 60 61 int main() 62 { 63 Teacher *tPt1 = NULL; 64 65 //demo1:c语言中的二级指针 66 getTeacher(&tPt1); 67 68 cout << tPt1->age << endl; 69 free(tPt1); 70 71 //demo2:c++中的引用:指针的引用 72 getTeacher2(tPt1); 73 cout << tPt1->age << endl; 74 75 std::cout << "Hello World!\n"; 76 }
2.常量引用




1 // dm03_const.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 2 // 3 4 #include <iostream> 5 6 using namespace std; 7 8 9 //demo3:常量引用做函数参数无法修改 10 11 struct Teacher 12 { 13 int age; 14 char name[64]; 15 }; 16 17 18 void getTeacher(const Teacher &t) 19 { 20 //这是错误的例子:const 修饰的Teacher 引用无法被修改; 21 //这样的写法类似于: 22 // const Teacher &t 类似于:const Teacher* const t 23 // 意义在于:指针变量和指针变量指向的内存空间都不能被修改 24 //t->age = 33; 25 } 26 27 28 int main() 29 { 30 //demo1:【普通引用】使用变量赋值引用 31 int a = 10; 32 int &x = a; 33 34 //demo2 常引用 35 36 //1)demo2-1:用变量初始化常引用 37 /** 38 * 理解概念: 39 * 常引用:增加const标识的就是常引用; 40 * 功能:让被引用的变量拥有只读属性 41 */ 42 int b = 210; 43 const int &x2 = b; 44 45 //2)demo2-2:用字面量初始化 常量引用 46 // 下面的demo是使用“常量”初始化常量引用 47 // 会为x3 单独的分配内存空间地址 48 const int &x3 = 41; //【注意】如果不加const,则41无法直接赋值给引用,因为“41”没有内存地址; 49 50 51 std::cout << "Hello World!\n"; 52 }
浙公网安备 33010602011771号