C++核心编程
面向对象编程技术,探讨C++中的核心和精髓
1 内存分区模型
C++程序执行时,将内存大方向划分为4个区域:
1、代码区:存放函数体的二进制代码,由操作系统进行管理。
2、全局区:存放全局变量、静态变量(static)、常量(#define/const)。
3、栈区:由编译器自动分配释放,存放函数的参数值(形参)、局部变量等。
4、堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收。
内存四区意义:不同区域存放的数据,赋予不同的生命周期,给我们更大的灵活编程
1.1 程序运行前
在程序编译后,生成了 exe 可执行程序,未执行该程序前分为两个区域
代码区:
1、存放CPU执行的机器指令。
2、代码区时共享的,共享的目的时对于频繁被执行的程序,只需要在内存中有一份代码即可
3、代码区是只读的,使其只读的原因是防止程序意外地修改了他的指令。
全局区:
1、全局变量(函数外)和静态变量(static int a)存放在此
2、全局区还包含了常量区(int a)、字符串常量、其他常量(const int a)也在这
3、该区域的数据在程序结束后由操作系统释放。
![b63e898afc2a595575da0581864239da.png](https://i-blog.csdnimg.cn/blog_migrate/0a8c072888680864650d8a717ca4a64d.png)
总结:
1、C++中在程序运行前分为全局区和代码区
2、代码区特点是共享和只读
3、全局区中存放全局变量、静态变量、常量
4、常量区中存放 const 修饰的全局常量 和 字符串常量
1.2 程序运行后
栈区:由编译器自动分配释放,存放函数的参数值、局部变量等。
注意:不要返回局部变量的地址,栈区开辟的数据由编译器自动释放。
![7dd3b6819ea109d35b5965a7a0084200.png](https://i-blog.csdnimg.cn/blog_migrate/4faf8eade57febb50950ebc58ff2f13d.png)
堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收。
注意:在C++中主要利用 new ,在堆区开辟内存。
![75e7e3a1655794d7664b23d3846ede20.png](https://i-blog.csdnimg.cn/blog_migrate/15397bcd9ff444e3ef5bdbf9cdbc4e28.png)
1.3 new操作符
C++中利用 new 操作符在堆区开辟数据
堆区开辟的数据,由程序员手动开辟,手动释放,释放利用操作符 delete
语法: new 数据类型
利用 new 创建的数据,会返回该数据对应的类型的指针
![36b560c29f0a168777bed95cdbf64122.png](https://i-blog.csdnimg.cn/blog_migrate/2303f652b8b4b4adf39551630bda8d7c.png)
#include
![ef6fbf35c00fe9f9b394dd60de9df1a0.png](https://i-blog.csdnimg.cn/blog_migrate/56b5764f60e507120d48e89967481e63.png)
2 引用
2.1 引用的基本使用
作用:给变量起别名
语法:数据类型 &别名 = 原名
![814d126e647acee26fa4cc773a5ab360.png](https://i-blog.csdnimg.cn/blog_migrate/07aeb73dcc3ea860d3ec50eaabbde452.png)
2.2 引用注意事项
1、引用必须初始化:直接int &b;//报错
2、引用在初始化后,不可以改变
![c470194aecbb42c85d4cfe79bd3c5ac1.png](https://i-blog.csdnimg.cn/blog_migrate/b3d94b29843f273d9b3fa06ca170a215.png)
2.3 引用做函数参数
作用:函数传参时,可以利用引用的技术让形参修饰实参
优点:可以简化指针修改实参
#include
![87a09d4f3a792c2df5784682f15d5da9.png](https://i-blog.csdnimg.cn/blog_migrate/c0cc3bfac52e9e00fa729379da77822e.png)
2.4 引用做函数返回值
作用:引用时可以作为函数的返回值存在的
注意:不要返回局部变量引用(栈区数值被清空)
用法:函数调用做左值
#include
![9ae6d5281822f55a922ae1882fc23413.png](https://i-blog.csdnimg.cn/blog_migrate/7d5c01580ee08415bcb607eddbfe989a.png)
2.5 引用的本质
本质:引用的本质在C++内部是一个指针常量(* const)
int & ref = a;相当于 int * const ref = &a;
![f5655f2d0779940c92aaac8388f0ed56.png](https://i-blog.csdnimg.cn/blog_migrate/fc0a0b404f9fd7dcb3bb483b522de396.png)
结论:C++推荐引用技术,因为语法方便,引用本质是指针常量,但所有的指针操作,编译器都帮我们做了
2.6 常量引用
作用:常量引用主要用来修饰形参,防止误操作
在函数形参列表中,可以加 const 修饰形参,防止形参改变实参
#include
3函数提高
3.1 函数默认参数
在C++中,函数的形参列表中的形参可以有默认值
语法:返回值类型 函数名(参数 = 默认值){ 代码体 }
#include
![d0b2c2ad76fdad8adbda26acf2dad401.png](https://i-blog.csdnimg.cn/blog_migrate/98f33aef9990e12c6335f618384a6a39.png)
注意事项:
1、如果某个位置已经有了默认参数,那么从这个位置往后,从左到右都必须有默认值
2、如果函数声明有了默认参数,函数的实现就不能有默认参数,只能二选一,不能同时。
3.2 函数占位参数
C++ 中函数的形参列标可以有占位参数,用来做占位,调用函数时必须填补该位置
语法:返回值类型 函数名 (数据类型){ }
注意:占位参数还可以有默认参数
![c0ed61ef8f14b475a7e5c49693052beb.png](https://i-blog.csdnimg.cn/blog_migrate/5cb1bb8d069562bab9dfb0fa1bdf9b36.png)
3.3函数重载
3.3.1 函数重载概述
作用:函数名可以相同,提高复用性
函数重载满足条件:
(1)同一个作用域下;(main或者全局作用域)
(2)函数名称相同;
(3)函数参数 类型不同 或者 个数不同 或者 顺序不同;
注意:函数的返回值不可以作为函数重载的条件
![1a52f33c37c239b6e1cbc74b62d90d12.png](https://i-blog.csdnimg.cn/blog_migrate/3f211aa761a17eb6ea08a15e63ffbe45.png)
3.3.2 函数重载注意事项
1、引用作为重载条件
2、函数重载碰到函数默认参数
#include
1-3章结束