02. C++核心编程
------------恢复内容开始------------
1. 内存分区模型
C++程序在执行时,将内存大方向划分为4个区域:
代码区:存放函数体的二进制代码,由操作系统进行管理的
全局区:存放全局变量和静态变量以及常量
栈区:由编译器自动分配释放,存放函数的参数值,局部变量等
堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收
内存4区的意义:
不同区域存放的数据,赋予不同的生命周期,给我们更大的灵活编程
1.1 程序运行前
在程序编译后,生成了exe可执行程序,未执行该程序前分为两个区域
代码区:
存放CPU执行的机器指令
代码区是共享的,共享的目的是对于频繁被执行的程序,只需要在内存中有一份代码即可。
代码区是只读的,使其只读的原因是防止程序意外地修改了它的指令。
全局区:
全局变量和静态变量存放在此
全局区还包含了常量区,字符串常量和其他常量也存放在此。
该区域的数据在程序结束后由操作系统释放。
总结:
C++ 中在程序运行前分为全局区和代码区
代码区特点是共享和只读
全局区中存放全局变量、静态变量、常量
常量区中存放const修饰的全局常量和字符串常量
1.2 程序运行后
栈区:
由编译器自动分配释放,存放函数的参数值,局部变量等
注意事项:不要返回局部变量的地址,栈区开辟的数据由编译器自动释放
堆区:
由程序员分配释放,若程序员不释放,程序结束时由操作系统回收
在C++中只要利用new在堆区开辟内存
总结:
堆区数据由程序员管理开辟和释放
堆区数据利用new关键字进行开辟内存
1.3 new 操作符
C++中利用new操作符在堆区开辟数据
堆区开辟的数据,由程序员手动开辟,手动释放,释放利用操作符delete
语法:new 数据类型
利用new创建的数据,会返回该数据对应的类型的指针、
int * p = new int(10);
2. 引用
2.1 引用的基本使用
作用:给变量起别名
语法:数据类型 &别名 = 原名
2.2 引用注意事项
引用必须初始化
引用在初始化后,不可以改变
2.3 引用做函数参数
作用:函数传参时,可以利用引用的技术让形参修饰实参
优点:可以简化指针修改实参
地址传递 引用传递
总结:通过引用参数产生的效果同按地址传递是一样的。引用的语法更清楚简单。
2.4 引用做函数返回值
作用:引用是可以作为函数的返回值存在的
注意:不要返回局部变量引用
用法:函数调用作为左值
2.5 引用的本质
本质:引用的本质在C++内部实现是一个指针常量
2.6 常量引用
3. 函数提高
3.1 函数默认参数
3.2 函数占位参数
3.3 函数重载
3.3.1 函数重载概述
3.3.2 函数重载注意事项
4. 类和对象
4.1 封装
4.1.1 封装的意义
4.1.2 struct 和 class 区别
4.1.3 成员属性设置为私有
4.2 对象的初始化和清理
4.2.1 构造函数和析构函数
构造函数语法:类名(){}
1. 构造函数,没有返回值也不用写void
2. 函数名称与类名相同
3. 构造函数可以有参数,因此可以发生重载
4. 程序在调用对象时候会自动调用构造,无须手动调用,而且只会调用一次
析构函数语法:~类名(){}
1. 析构函数,没有返回值也不用写void
2. 函数名称与类名相同,在名称前加上符号~
3. 析构函数不可以有参数,因此不可以发生重载
4. 程序在对象销毁前会自动调用析构,无须手动调用,而且只会调用一次
4.2.2 构造函数的分类及使用
两种分类方式:
按参数分为:有参构造和无参构造
按类型分为:普通构造和拷贝构造
三种调用方式:
括号法
显示法
隐式转换法
4.2.3 拷贝构造函数调用时机
使用一个已经创建完毕的对象来初始化一个新对象
值传递的方式给函数参数传值
以值方式返回局部对象
4.2.4 构造函数调用规则
默认情况下,C++编译器至少给一个类添加3个函数
1. 默认构造函数(无参,函数体为空)
2. 默认析构函数(无参,函数体为空)
3. 默认拷贝构造函数,对属性进行值拷贝
构造函数调用规则如下:
如果用户定义有参构造函数,C++不再提供默认无参构造,但是会提供默认拷贝构造
如果用户定义拷贝构造函数,C++不再提供其他构造函数
4.2.5 深拷贝与浅拷贝
4.2.6 初始化列表
4.2.7 类对象作为类成员
4.2.8 静态成员
4.3 C++对象模型和this指针
4.4 友元
4.5 运算符重载
4.6 继承
4.7 多态

浙公网安备 33010602011771号