本阶段主要针对C++面向对象编程技术做详细讲解,探讨C++中的核心和精髓
目录
1.内存分区模型
C++程序在执行时,将内存大方向划分为4个区域
1>代码区:存放函数体的二进制代码,由操作系统进行管理的
2>全局区:存放全局变量和静态变量以及常量
3>栈区:由编译器自动分配释放,存放函数的参数值、局部变量等。
4>堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收
内存四区意义:
不同区域存放的数据,赋予不同的生命周期,给我们更大的灵活编程
1.1 程序运行前
在程序编译后,生成了exe可执行操作,未执行该程序前分为两个区域
代码区:
存放CPU执行的机器指令
代码区是共享的,共享的目的是对于频繁被执行的程序,只需要在内存中有一份代码即可
代码区是只读的,使其只读的原因是防止程序意外地修改它的指令
全局区:
全局变量和静态变量存放在此
全局区还包括了常量区,字符串常量和其他常量也存放在此
该区域的数据在程序结束后由操作系统释放
示例:
打印结果:
总结:
1>C++中在程序运行前分为全局区和代码区
2>代码区特点是共享和只读
3>全局区中存放全局变量、静态变量、常量
4>常量区中存放 const修饰的全局变量和字符串常量
1.2程序运行后
栈区:
由编译器自动分配释放,存放函数的参数值、局部变量等
注意事项:不要返回局部变量的地址,栈区开辟的数据由编译器自动释放
示例:
堆区:
由程序员分配释放,若程序员不释放,程序结束时由操作系统回收
在C++中主要利用new在堆区开辟内存
示例:
总结:
堆区数据由程序员管理开辟和释放
堆区数据利用new关键字进行开辟内存
1.3 new操作符
C++中利用new操作符在堆区开辟数据
堆区开辟的数据,由程序员手动开辟,手动释放,释放利用操作符 delete
语法: new 数据类型
利用new创建的数据,会返回该数据对于的类型的指针
示例1:基本语法
示例2:开辟数组
2. 引用
2.1引用的基本使用
作用:给变量起别名
语法:数据类型 &别名 = 原名
示例:
2.2 引用注意事项
1>引用必须要初始化
2>引用在初始化后,不可以改变
示例:
2.3 引用做函数参数
作用: 函数传参时,可以利用引用的技术让形参修饰实参
优点: 可以简化指针修改实参
示例:
总结:通过引用参数产生的效果同按地址传递是一样的,引用的语法更清楚简单
2.4 引用做函数返回值
作用:引用是可以作为函数的返回值存在的
注意:不要返回局部变量引用
用法:函数调用作为左值
示例:
2.5 引用的本质
本质:引用的本质在C++内部实现是一个指针常量
示例:
总结:C++推荐用引用技术,因为语法方便,引用本质是指针常量,但是所有的指针操作编译器都帮我们做了
2.6 常量引用
作用:常量引用主要用来修饰形参,防止误操作
在函数形参列表,可以加const修饰形参,防止形参改变实参
示例:
3. 函数提高
3.1 函数默认参数
在C++中,函数的形参列表中的形参是可以有默认值的。
语法 : 返回值类型 函数名 (参数= 默认值) {}
示例:
3.2 函数占位参数
C++中函数的形参列表里可以有占位参数,用来做占位,调用函数时必须填补该位置
语法: 返回值类型 函数名 (数据类型){ }
示例:
3.3 函数重载
3.3.1函数重载概述
作用:函数名可以相同,提高复用性
函数重载满足条件:
1>同一个作用域下
2>函数名称相同
3>函数参数类型不同或者个数不同或者顺序不同
注意:函数的返回值不可以作为函数重载的条件
示例:
3.3.2 函数重载注意事项
1>引用作为重载条件
2>函数重载碰到函数默认参数
示例:
4. 类和对象
C++面向对象的三大特性为:封装、继承、多态
C++认为万事万物都皆为对象,对象上有其属性和行为
例如:
人可以作为对象,属性有姓名、年龄、身高、体重.....,行为有走、跑、吃饭、唱歌.....
车也可以作为对象,属性有轮胎、方向盘、车灯.....,行为有载人、放音乐....
具有相同性质的对象,我们可以抽象称为类,人属于人类,车属于车类
4.1 封装
4.1.1 封装的意义
封装是C++面向对象三大特征之一
封装的意义:
1>将属性和行为作为一个整体,表现生活中的事务
2>将属性和行为加以权限控制
封装意义一:
在设计类的时候,属性和行为写在一起,表现事物
语法:
class 类名{ 访问权限: 属性 / 行为 };
示例1:设计一个圆类,求圆的周长
示例2:设计一个学生类,属性有姓名和学号,可以给姓名和学号赋值,可以显示学生的姓名和学号
封装意义二:
类在设计时,可以把属性和行为放在不同的权限下,加以控制
访问权限有三种:
1.public 公共权限 类内可以访问,