当前位置:   article > 正文

【C++对C语言的拓展】引用--3

【C++对C语言的拓展】引用--3

1.8 指针引用

  1. #include  <iostream>
  2. using namespace  std;  
  3. struct  Teacher  
  4. {  
  5. char  name[64];  
  6. int  age  ;  
  7. };  
  8. //在被调⽤用函数 获取资源
  9. int  getTeacher(Teacher  **p)  
  10. {  
  11.        Teacher  *tmp  =  NULL;  
  12. if  (p  ==  NULL)  
  13.        {  
  14. return  -­‐1;  
  15.        }  
  16.        tmp  =  (Teacher  *)malloc(sizeof(Teacher));  
  17. if  (tmp  ==  NULL)  
  18.        {  
  19. return  -­‐2;  
  20.        }  
  21.        tmp-­‐>age  =  33;  
  22. //  p是实参的地址    *实参的地址 去间接的修改实参的值
  23.        *p  =  tmp;  
  24. return 0;  
  25. }  
  26. //指针的引⽤用 做函数参数
  27. int  getTeacher2(Teacher*  &myp)  
  28. {  
  29. //给myp赋值 相当于给main函数中的pT1赋值
  30.        myp  =  (Teacher  *)malloc(sizeof(Teacher));  
  31. if  (myp  ==  NULL)  
  32.        {  
  33. return  -­‐1;  
  34.        }  
  35.        myp-­‐>age  =  36;  
  36. return 0;  
  37. }  
  38. void  FreeTeacher(Teacher  *pT1)  
  39. {  
  40. if  (pT1  ==  NULL)  
  41.        {  
  42. return  ;  
  43.        }  
  44.        free(pT1);  
  45. }  
  46. int  main(void)  
  47. {  
  48.        Teacher  *pT1  =  NULL;  
  49. //1  c语⾔言中的⼆二级指针
  50.        getTeacher(&pT1);  
  51.        cout<<"age:"<<pT1-­‐>age<<endl;  
  52.        FreeTeacher(pT1);  
  53. //2  c++中的引⽤用 (指针的引⽤用)
  54. //引⽤用的本质 间接赋值后2个条件 让c++编译器帮我们程序员做了。
  55.        getTeacher2(pT1);  
  56.        cout<<"age:"<<pT1-­‐>age<<endl;  
  57.        FreeTeacher(pT1);  
  58. return 0;  
  59. }  

1.9 const 引用
const  引用有较多使用。它可以防止对象的值被随意修改。因而具有一
些特性。    
  (1)const  对象的引用必须是  const  的,将普通引用绑定到  const  对象是不
合法的。 这个原因比较简单。既然对象是  const  的,表示不能被修改,引用当然
也不  能修改,必须使用  const  引用。实际上,
      const  int  a=1;  
      int  &b=a;
这种写法是不合法  的,编译不过。  
  (2)const  引用可使用相关类型的对象(常量,非同类型的变量或表达式)初
始化。 这个是  const  引用与普通引用最大的区别。
      const  int  &a=2;
是合法的。
      double  x=3.14;  
      const  int  &b=a;
也是合法的。    

  1. #include  <iostream>
  2. using namespace  std;  
  3. int  main(void)  
  4. {  
  5. //普通引⽤用
  6. int    a  =  10;  
  7. int  &b  =  a;  
  8.        cout  <<  "b  =  "  <<  b  <<  endl;  
  9. //常引⽤用
  10. int    x  =  20;  
  11. const int  &y  =  x;      //常引⽤用是限制变量为只读 不能通过y去修改x了
  12. //y  =  21;                      /error
  13. return 0;  
  14. }

1.10 const引用的原理
  const  引用的目的是,禁止通过修改引用值来改变被引用的对象。const  
引用的  初始化特性较为微妙,可通过如下代码说明:

  1. double  val  =  3.14;  
  2. const int  &ref  =  val;  
  3. double  &  ref2  =  val;  
  4. cout<<ref<<"  "<<ref2<<endl;  
  5. val  =  4.14;  
  6. cout<<ref<<"  "<<ref2<<endl;  

上述输出结果为  3  3.14  和  3  4.14。因为  ref  是  const  的,在初始化的过
程中已经给定值,不允许修改。而被引用的对象是  val,是非  const  的,所以  val  
的修改并未  影响  ref  的值,而  ref2  的值发生了相应的改变。    
  那么,为什么非  const  的引用不能使用相关类型初始化呢?实际上,const  
引用  使用相关类型对象初始化时发生了如下过程:  
int  temp  =  val;  
const int  &ref  =  temp;
  如果  ref  不是  const  的,那么改变  ref  值,修改的是  temp,而不是  val。期
望对  ref  的赋值会修改  val  的程序员会发现  val  实际并未修改。  

  1. #include  <iostream>
  2. using namespace  std;  
  3. int  main(void)  
  4. {  
  5. //1>  ⽤用变量 初始化 常引⽤用
  6. int  x1  =  30;  
  7. const int  &y1  =  x1;  //⽤用x1变量去初始化 常引⽤用
  8. //2>  ⽤用字⾯面量 初始化 常量引⽤用
  9. const int  a  =  40;    //c++编译器把a放在符号表中
  10. //int  &m  =  41;  //error  ,  普通引⽤用 引⽤用⼀一个字⾯面量 请问字⾯面量有没有内存地址
  11. const int  &m  =  43;    //c++编译器 会 分配内存空间
  12. //  int  temp  =  43
  13. //  const  int  &m  =  temp;
  14. return 0;  
  15. }
  1. #include  <iostream>
  2. using namespace  std;  
  3. struct  Teacher  
  4. {  
  5. char  name[64];  
  6. int  age  ;  
  7. };  
  8. void  printTeacher(const  Teacher  &myt)  
  9. {  
  10. //常引⽤用 让 实参变量 拥有只读属性
  11. //myt.age  =  33;
  12.        printf("myt.age:%d \n",  myt.age);  
  13. }  
  14. int  main(void)  
  15. {  
  16.        Teacher    t1;    
  17.        t1.age  =  36;  
  18.        printTeacher(t1);  
  19. return 0;                                
  20. }

结论:
1)const int & e 相当于 const int * const e
2)普通引用 相当于 int *const e
3)当使用常量(字面量)对const引用进行初始化时,C++编译器会为常量值
分配空间,并将引用名作为这段空间的别名
4)使用字面量对const引用初始化后,将生成一个只读变量
 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/406184
推荐阅读
相关标签
  

闽ICP备14008679号