首页 > 编程语言 >【C++对C语言的拓展】引用--3

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

时间:2024-04-08 23:35:12浏览次数:25  
标签:const val -- C++ C语言 int 引用 return Teacher

1.8 指针引用

#include  <iostream>
using namespace  std;  
struct  Teacher  
{  
char  name[64];  
int  age  ;  
};  
//在被调⽤用函数 获取资源
int  getTeacher(Teacher  **p)  
{  
       Teacher  *tmp  =  NULL;  
if  (p  ==  NULL)  
       {  
return  -­‐1;  
       }  
       tmp  =  (Teacher  *)malloc(sizeof(Teacher));  
if  (tmp  ==  NULL)  
       {  
return  -­‐2;  
       }  
       tmp-­‐>age  =  33;  
//  p是实参的地址    *实参的地址 去间接的修改实参的值
       *p  =  tmp;  
return 0;  
}  
//指针的引⽤用 做函数参数
int  getTeacher2(Teacher*  &myp)  
{  
//给myp赋值 相当于给main函数中的pT1赋值
       myp  =  (Teacher  *)malloc(sizeof(Teacher));  
if  (myp  ==  NULL)  
       {  
return  -­‐1;  
       }  
       myp-­‐>age  =  36;  
return 0;  
}  
void  FreeTeacher(Teacher  *pT1)  
{  
if  (pT1  ==  NULL)  
       {  
return  ;  
       }  
       free(pT1);  
}  
int  main(void)  
{  
       Teacher  *pT1  =  NULL;  
//1  c语⾔言中的⼆二级指针
       getTeacher(&pT1);  
       cout<<"age:"<<pT1-­‐>age<<endl;  
       FreeTeacher(pT1);  
//2  c++中的引⽤用 (指针的引⽤用)
//引⽤用的本质 间接赋值后2个条件 让c++编译器帮我们程序员做了。
       getTeacher2(pT1);  
       cout<<"age:"<<pT1-­‐>age<<endl;  
       FreeTeacher(pT1);  
return 0;  
}  

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;
也是合法的。    

#include  <iostream>
using namespace  std;  
int  main(void)  
{  
//普通引⽤用
int    a  =  10;  
int  &b  =  a;  
       cout  <<  "b  =  "  <<  b  <<  endl;  
//常引⽤用
int    x  =  20;  
const int  &y  =  x;      //常引⽤用是限制变量为只读 不能通过y去修改x了
//y  =  21;                      /error
return 0;  
}

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

double  val  =  3.14;  
const int  &ref  =  val;  
double  &  ref2  =  val;  
cout<<ref<<"  "<<ref2<<endl;  
val  =  4.14;  
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  实际并未修改。  

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

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

 

标签:const,val,--,C++,C语言,int,引用,return,Teacher
From: https://blog.csdn.net/ffffffeiyu/article/details/137335680

相关文章

  • windows消息机制--1基本概念解释
    基本概念解释我们在编写标准C程序的时候,经常会调用各种库函数来辅助完成某些功能:初学者使用得最多的C库函数就是printf了,这些库函数是由你所使用的编译器厂商提供的。在Windows平台下,也有类似的函数可供调用:不同的是,这些函数是由Windows操作系统本身提供的。1)SDK和APISD......
  • 毕业设计:基于卷积神经网络的条形码识别系统 深度学习 人工智能 计算机视觉
    目录 前言设计思路一、课题背景与意义二、算法理论原理2.1卷积神经网络2.2目标检测三、检测的实现3.1数据集3.2实验环境3.3模型训练最后 前言    ......
  • 毕业设计:基于机器学习的违规占道经营识别系统 人工智能
    目录前言设计思路一、课题背景与意义二、算法理论原理2.1卷积神经网络2.2目标检测算法三、检测的实现3.1数据集3.2实验环境搭建3.3实验及结果分析最后前言    ......
  • 17. InnoDB-spaceID.PageNumber/压缩表
    表空间内部组织结构表空间内部由多个段对象(Segment)组成每个段(Segment)由区(Extent)组成每个区(Extent)由页(Page)组成每个页(Page)里面保存数据(或者叫记录Row)段对用户来说是透明的段也是一个逻辑概念目前为止在information_schema中无法找到段的概念重点需要理解......
  • 热更新框架3-能够理解框架的设计思想
    热更新框架是一种用于在运行时更新应用程序代码的工具。它的设计思想主要是为了解决应用程序更新的问题,使得开发者可以在不停止或重新启动应用程序的情况下,实时地更新代码和资源。热更新框架的设计思想通常包括以下几个方面:动态加载:热更新框架通过动态加载机制,将新的代码和......
  • GitHub提交PR
    一、以"茴香豆"开源项目为例1、github地址https://github.com/InternLM/HuixiangDou/tree/main2、点击Fork项目,将该项目的仓库复制到你自己的GitHub账号下3、在你自己的GitHub账号下,找到刚刚”Fork”的项目仓库,点击”Code”按钮,复制仓库的URL4、在本地终端打开一个文件......
  • Java基础知识总结(44)
    (1)Arrays工具类Java提供了Arrays工具类,里面包含了一些方法,可以直接操作数组。1、intbinarySearch(long[]a,longkey):使用二分查找法查询key元素值在数组a中出现的索引,如果a数组不包含key元素,则返回负数,调用此方法时要求数组中的元素已经按升序排列。先排序再......
  • JVM
    一、JVM是什么JavaVirtualMaachineJava程序的运行环境(Java二进制字节码的运行环境)。优点:一次编写,到处运行自动内存管理,垃圾回收机制二、JVM的组成什么是程序计数器?线程私有的(线程安全),内部保存的字节码的行号。用于记录正在执行的字节码的地址。案例:publiccla......
  • osg 标准视图、前视图、侧视图、顶视图切换
      #include<osg/Node>#include<osg/Geode>#include<osg/ShapeDrawable>#include<osgViewer/Viewer>#include<osgGA/GUIEventHandler>//自定义的视图切换事件处理器classViewSwitchHandler:publicosgGA::GUIEventHandler{public:V......
  • Java基础知识总结(45)
    (3)类和对象      类是面向对象的重要内容,可以把类当做一种自定义类型,可以使用类来定义变量,这种类型的变量统称为引用类型变量。(4)定义类      类是对一批对象的抽象,可以把类理解成某个群体,对象则是具体的存在。      [修饰符]class类名{   ......