C++核心编程
1. 内存分区模型
C++在执行时,将内存大方向划分为4个区域
代码区:函数体的二进制代码,由操作系统进行管理
全局区:存放全局变量和,静态变量以及常量
栈区:由编译器自动分配释放,存放函数的参数值,局部变量等
堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收
意义
不同区域存放的数据,赋予不同的生命周期,给我们更大的灵活编程。
1.1 程序运行前
程序编译后,生成exe可执行程序,执行前分为两个趋于
代码区
存放cpu执行的机器指令(就是你写的代码)
代码区是共享的,频繁执行的程序,只需要有一份代码即可
代码区是只读的,防止程序意外修改
全局区
存放全局变量和静态变量
全局区还包含了常量区,存放字符串常量和其他常量
该区域的出局在程序结束后由操作系统释放
1 |
|
1 | a:2130114772 |
1.2 程序运行后
栈区
由编译器自动分配释放,存放函数的参数值,局部变量等
注意事项:不要返回局部变量的地址,栈区开辟的数据由编译器自动释放(但是我用vs2022可以一直保留局部变量)
堆区
由程序员分配释放,若程序员不释放,程序结束时由操作系统回收
在c++中主要利用new在堆区开辟内存
由程序员手动开辟,手动释放,释放利用操作符delete
语法:new
数据类型
利用new创建的数据,会返回该数据对应的类型的指针
2. 引用
2.1 引用的基本使用
作用:给变量起别名
语法:数据类型 &别名=原名
2.2 引用的注意事项
- 引用必须初始化
- 引用在初始化后,不可以改变
2.3 引用做函数参数
作用:函数传参时,可以利用引用的技术让实参修饰形参
优点:可以简化指针修改实参
1 | void mySwap01(int &a, int &b) |
总结通过引用参数产生的效果和地址传递是一样的,引用的语法更清楚简单
2.4 引用做参数的返回值
作用:引用是可以作为函数的返回值存在的
注意不要返回局部变量引用
用法:函数调用作为左值(等号左边)
1 | int& ref = test01(); |
2.5 引用的本质
本质:引用的本质在C+=内部实现是一个指针常量
1 | int& ref = a;//自动转换为 int* const ref = &a; |
结论C++推荐使用引用技术,因为语法方便,引用本质是指针常量,但是所有的指针编译器都帮我们做了
2.6 常量引用
作用:常量引用主要用来修饰形参,防止误操作
在函数形参列表中,可以加const
修饰形参,防止形参改变实参
void print(const int &a)
3.函数提高
3.1 函数的默认参数
形参可以有默认值
语法:返回类型值 函数名 (参数=默认值){}
注意:
- 如果自己传入数据,则用自己传的,没有传则用默认的
- 默认参数必须在形参列表结尾
- 函数声明和实现只能有一个有默认参数
3.2 函数占位参数
函数的形参列表里可以有占位参数,用来占位,调用函数时必须填补该位置
语法:返回值类型 函数名 (数据类型){}
占位参数可以有默认参数
3.3 函数重载
3.3.1 函数重载概述
作用:函数名可以相同,提高复用性
函数重载满足条件:
- 同一个作用域下
- 函数名相同
- 函数参数类型不同或个数不同或顺序不同
1 | void func() |
注意:
函数的返回值不可以作为函数重载的条件
引用可以作为重载的条件
注意:
int &a
和const int &a
可以作为重载的条件。当传入变量(int a=10
)时调用使用int &a
的函数,当直接传入确定数值(10
)时调用使用const int &a
的变量。函数碰到默认参数时,要排除默认参数后剩下的函数参数类型不同或个数不同或顺序不同,才可以重载。
4 类和对象
(我感觉和结构体很像,但是百度之后发现,他们默认的访问权限不一样,而且类是有继承的,结构体没有继承。)
- C++结构体内部成员变量及成员函数默认的访问级别是public,而c++类的内部成员变量及成员函数的默认访问级别是private。
- C++结构体的继承默认是public,而c++类的继承默认是private。
C++面向对象的三大特性:封装,继承,多态
C++认为万事万物皆有对象,对象上有其属性的行为
4.1 封装
(1) 封装的意义
封装是C++面向对象三大特性之一
封装的意义:
将属性和行为作为一个整体,表现生活中的事物
将属性和行为加以权限控制
意义一:
在设计的时候,属性和行为写在一起,表现事物
语法:class 类名{ 访问权限: 属性/行为 }
1 | #include<iostream> |
类中的属性和行为同意成为成员
- 属性:成员属性,成员变量
- 行为:成员函数,成员方法
也可以通过行为给属性赋值
意义二:
类在设计时可以把属性和行为放在不同的权限下,加以控制
访问权限有三种:
- public 公共权限 类内类外都可以访问呢
- protected 保护权限 类内可以访问,类外不可以
- private 私有权限 类内可以访问,类外不可以
(2)成员属性设置为私有
优点1:将所有成员属性设置为私有,可以自己控制读写权限
优点2:对于写权限,我们可以检测数据的有效性