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 }

 

posted @ 2021-01-05 20:58  OzTaking  阅读(117)  评论(0)    收藏  举报