1.c++基础知识
1.指针
1.1空指针和野指针
空指针:指针变量指向内存中编号为0的空间
用途:初始化指针变量
注意:空指针指向的内存是不可以访问的
野指针:指针变量指向非法的内存空间
1.2const修饰指针
1.const修饰指针–常量指针
//指针的指向可以修改,但是指针指向的值不能修改
const int * p = &a;
2.const修饰常量–指针常量
//指针的指向不可以改,指针指向的值可以改
int * const p = &a;
3.const既修饰指针,又修饰常量
//指针的指向和指针指向的值都不能修改
const int * const p = &a;
1.3指针和数组
作用:利用指针访问数组中的元素
1.4指针和函数
作用:利用指针作函数参数,可以修改实参的值
2.c++核心编程
1.内存分区模型
代码区:存放函数体的二进制代码,由操作系统进行管理的
全局区:存放全局变量和静态变量以及常量
栈区:由编译器自动分配释放,存放函数的参数值,局部变量等
堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收
分区:不同的区域存放不同的数据,赋予不同的声明周期
1.1程序运行前
代码区:存放CPU执行的机器指令
共享
只读
全局区:全局变量和静态变量、常量,该区域的数据在程序结束后由操作系统释放
1.2程序运行后
栈区:
编译器自动分配释放,存放函数的参数值、局部变量
不要返回局部变量的地址,栈区开辟的数据由编译器自动释放
堆区:
程序员分配释放,程序结束时由操作系统回收
使用new关键字
2.引用
2.1引用的基本使用
4.类和对象
4.1封装
4.1.2struct 和class区别
唯一的区别:默认访问权限不同
struct:默认权限为公共
class:默认权限为私有
4.2对象初始化和清理
4.2.1构造函数和析构函数
4.2.2构造函数的分类及调用
两种分类方式:
-
按参数分:有参构造和无参构造
-
按类型分:普通构造和拷贝构造
三种调用方式:
- 括号法
- 显示法
- 隐式转换法
Person p = 10;//相当于进行了有参构造
Person p2 = p5;//拷贝构造
4.2.3拷贝构造函数调用时机
- 使用一个已经创建完毕的对象来 初始化一个新对象
- 值传递的方式给函数参数传值
- 以值方式返回局部对象
4.2.4构造函数调用规则
默认情况下,c++编译器至少给一个类添加三个函数
- 默认构造函数(无参,函数体为空)
- 默认析构函数(无参,函数体为空)
- 默认拷贝构造函数,对属性进行值拷贝
构造函数调用规则:
- 如果用户定义有参构造函数,c++不在提供默认无参构造,但是会提供默认拷贝构造
- 如果用户定义拷贝构造函数,c++不会再提供其他构造函数
4.2.5深拷贝与浅拷贝
浅拷贝:简单的赋值拷贝操作
深拷贝:在堆区重新申请空间,进行拷贝操作
4.2.6初始化列表
4.2.7类对象作为类成员
c++类中的成员可以是另一个类的对象,我们称该成员为对象成员
构造和析构顺序:
class A{}
class B{
A a;
}
构造:先A后B(先构造类对象,再构造自身)
析构:先B后A(与构造相反)
4.2.8静态成员
- 静态成员变量
- 所有对象共享一份数据
- 在编译阶段分配内存
- 类内声明,类外初始化
- 静态成员函数
- 所有的对象共享一个函数
- 静态成员函数只能访问静态成员变量
4.3c++对象模型和this指针
4.3.1成员变量和成员函数分开存储
只有非静态成员变量才属于类的对象上
空对象占用内存空间为1:c++编译器会给每个空对象分配一个字节空间,是为了区分空对象占内存的位置
4.3.2this指针
this指针指向被调用的成员函数所属的对象
this指针的本质是指针常量,指针的指向是不可以修改的
this指针是隐含在每一个非静态成员函数内的一种指针
this指针不需要定义,直接使用即可
this指针的用途:
- 当形参和成员变量名相同时,可以用this指针来区分
- 在类的非静态成员函数中返回对象本身,可使用return *this
4.3.3空指针访问成员函数
空指针也可以调用成员函数,但要注意有没有用到this指针
如果用到this指针,需要家一判断保证代码的健壮性
4.3.4const修饰成员函数
常函数:
- 成员函数后加const后我们称这个函数为常函数
- 常函数内不可以修改成员属性
- 成员属性声明时加关键字mutable后,在常函数中可以修改
常对象:
- 声明对象前加const称该对象为常对象
- 常对象只能调用常函数
在成员函数后面加const,修饰的是this指针,让指针指向的值也不可以修改
4.4友元
友元的目的就是让一个函数或类,访问另一个类中私有成员
三种实现:
- 全局函数做友元
- 类做友元
- 成员函数做友元
4.5运算符重载
4.5.1加号运算符重载
成员函数重载+
全局函数重载+
对于内置的数据类型表达式的运算符是不可以改变的
4.5.2左移运算符重载
作用:可以输出自定义数据类型
通常不用成员函数重载<<运算符,因为无法实现cout在左侧
只能利用全局函数重载左移运算符
ostream & operator<<(ostream &cout,Person &p)
4.5.3递增运算符重载
前置递增
后置递增