当前位置: 首页 > news >正文

C++学习<2>--引用、函数、内存分区

一、程序内存分区

1、代码区:

        存放程序的机器指令,即编译后的二进制代码。通常为只读,防止程序意外修改自身指令,且可能被多个进程共享,以节省内存空间。

2、全局/静态存储区

        已初始化数据段:用于存放程序中明确被初始化的全局变量、静态变量以及常量数据等。这些数据在程序的整个运行期间都存在,并且可以被多个函数访问。

在定义变量时,加上static可做为静态变量,存放于全局

3、BSS 段(未初始化数据段):

        主要存放全局未初始化变量和未初始化静态变量。该区域的数据在程序开始执行之前被内核初始化为0或者空(NULL)。

4、堆区:

        用于动态内存分配,由程序员手动申请和释放。通过 malloc、calloc 等函数进行分配内存,使用完毕后需手动调用 free 函数释放,否则可能导致内存泄漏。堆区的大小不固定,可动态扩张或缩减。

堆内存仅在程序运行时分配

也就是说在堆区的数据,影响只影响该代码的运行速度与使用,不会对电脑造成影响。

可以用new定义局部变量,让其存放堆区,由程序员决定生死,而非编辑器来管理。

new来定义返回的是该数据类型的指针

int *p =new int(10);定义一个数

int *arr =new int[10];定义一个数组

delete  *p释放一个数

delete []  arr释放一个数组

delete  来释放堆区的数据

5、栈区:

        由编译器自动管理,主要用于存放函数调用时的参数、局部变量以及函数返回地址等。遵循后进先出的原则,每次函数调用时会在栈上分配一块内存区域,函数执行完毕后自动释放该区域的内存。栈的大小有限,若递归调用过深或局部变量过多,可能会导致栈溢出。

        如果运用完函数后就会释放所定义局部变量,也就是说,对于在函数中的局部变量,在使用一次释放,如果用指针由其地址运用解引用,写不出,除非再次调用该函数来生成该变量。

6、常量区:

        存放字符串字面常量和其他只读常量。一般位于只读数据段,防止程序修改。

二、引用(变量的引用就是变量的别名,因此引用又称别名

1、引用的基本语法:

        数据类型 &别名=原名  

eg:int a= 10; int &b=a;

引用必须初始化:就必须要写其等于什么

一旦初始化,则不能改变:不能再次将该引用的变量作为另一个数的别名

2、引用做函数参数

        在函数接收时直接初始化引用,直接对初始化别名进行操作

void hanshu(int &a ,int &b){}int main(){int a,b;hanshu(a,b);}

3、引用函数返回值不能局部变量,若加上static变为全局使

4、函数的返回值是引用,则函数调用可作为左值

5、引用的本质引用相当于指针

eg:int & ref =a;  相当于  int * const ref =a;

ref =20 相当于  * ref =20;

编译器识别到引用自动转化为指针

6、对于使用const来修饰引用,不允许改变该引用的值,但是它不阻止引用所代表的变量的值。使用后编译器自动改为:

const int & ref =10;

相当于

int temp =10; const int& ref =temp;

这种方法,可以来修饰形参(也就是函数中定义的引用值),这样用常量引用避免误操作修改实参,主函数中的值。

7、不允许建立void类型的引用

8、不能建立引用的数组

9、不能建立引用的引用。不能建立指向引用的指针。引用本身不是一种数据类型,所以没有引用的引用,也没有引用的指针。

10、可以将引用的地址赋值给一个指针,此时指针指向的是原来的变量。

三、函数的其他特点

1、函数默认参数

(1)如果我们传入数据,就用传入的数据,若无,则使用默认值

Eg :int func(int a,int b=20,int c=30){return a+b+c;}

(2)若某个位置已默认参数么这个位置往后从左到右必须要默认

Eg:上面那个b已经默认值为20,那c一定要有默认值,否则报错。

(3)函数声明与函数实现只有一个默认参数

2、占位参数

占位参数:  返回值类型 函数名 (数据类型){}

占位参数也可有默认参数

Eg:void func(int a,int )
{ cout << “ok” << end1;}

3、函数重载

(1)函数重载的满足条件:

  1. 个作用域下(如全局作用域下)
  2. 函数名相同
  3. 函数参数类型不同,或者个数不同,或者顺序不同
Eg:void func() {}void func (int a) {}void func (double  a) {}void func (double  a,int b) {}void func (int a,double b) {}

这些都为函数重载

注:函数的返回值不能作为函数重载的条件 

加上const也可以进行函数重载,不过传入的为常数

当函数重载中有默认参数也不行

总的来说:只要判断为两个函数,在调用的时候不能同时进入,就可以为函数重载

结语

还在学习中,如有错误还请大佬们指出,有问题可相互交流

http://www.lryc.cn/news/595146.html

相关文章:

  • 【2025】Vscode Python venv虚拟环境显示“激活终端”成功但是在终端中“并没有激活成功”,pip安装还是会安装到全局环境中的解决方法;
  • 第十八节:第七部分:java高级:注解的应用场景:模拟junit框架
  • nextjs+react接口会请求两次?
  • 元宇宙与DAO自治:去中心化治理的数字文明实践
  • 【设计模式C#】简单工厂模式(用于简化获取对象实例化的复杂性)
  • 实时数据可视化的“心跳”设计:毫秒级延迟下的动态图表抗闪烁优化方案
  • 时空数据可视化新范式:基于Three.js的生产全流程时间轴回溯技术解析
  • 基于爬虫技术的电影数据可视化系统 Python+Django+Vue.js
  • 基于VSCode的nRF52840开发环境搭建
  • 机器学习中核心评估指标(准确率、精确率、召回率、F1分数)
  • 动态数据源切换
  • Android Jetpack系列组件之:LiveData(保姆级教程)
  • 动静态库原理与实战详解
  • Ubuntu 22 安装 ZooKeeper 3.9.3 记录
  • 【HarmonyOS】ArkUI - 声明式开发范式
  • 信息整合注意力IIA,通过双方向的轻量级注意力机制强化目标关键特征并抑制噪声,提升特征融合的有效性和空间位置信息的保留能力。
  • I2S音频的时钟
  • C/C++ 详谈结构体大小计算(内存对齐)
  • 移动端轻量级神经网络推理框架
  • 蚂蚁数科AI数据产业基地正式投产,携手苏州推进AI产业落地
  • 解决mac chrome无法打开本地网络中的内网网址的问题
  • ELN和LIMS的区别
  • Django关于ListView通用视图的理解(Cursor解释)
  • Java基础教程(010):面向对象中的this和就近原则
  • 算法训练营DAY37 第九章 动态规划 part05
  • 两个相机的视野 拼接算法
  • 【C++】stack和queue拓展学习
  • DevCon 6记录
  • 从 “能用“ 到 “好用“:中小制造企业数字化转型中的 IT 系统优化管理策略
  • 扬声器测试解决方案