1.重载的常函数 常对象 非常函数
常函数对成员变量只读
常对象只能访问常成员函数
2.拷贝构造函数 深浅拷贝区别
提供任意构造函数都不会再提供默认构造
提供拷贝构造函数就不会提供默认构造,提供有参的构造就不会再提供无参构造
3.构造函数 析构函数 析构时释放指针
没有返回值,所以定义时不用指定类型,函数类型就是返回值类型
析构函数用来释放成员变量指向的堆区内存
析构后(释放指针)要把指针指向nullptr,不然会产生野指针
4.多文件编程extern
编译器编译时候会把所哟的cpp文件整合到一个obj文件中,会有一个符号表,然后有重复的就会报错重定义,这时需要extern声明
extern声明时不能赋值
extern int a = 1;//会报错
.cpp中没引入的.h文件,这些.h文件就不会参与编译
5.文件重复引用#pragma once
防止头文件重复编译
6.初始化参数列表特点
1.初始化参数列表只能在构造函数中使用 2.初始化参数列表初始化的顺序和参数列表中的顺序无关只和成员变量的顺序相同 3.常量和引用最好在初始化参数列表中初始化增加了灵活性
7.友元函数
优点
缺点
8.new 和 delete
A* p 那个调用了三次拷贝构造
new分配的是连续的,new 能申请数组,数组肯定是连续的
delete是先调用析构再free的
new的用delete,不用free
malloc的用free
malloc和new的区别
没有申请到内存的时候,malloc返回空,new返回
try catch?
9.静态成员函数
没有this指针,所以不能访问普通成员变量
普通成员函数,会把this当隐藏参数传进去,所以能访问成员函数,但是静态成员函数没有this
this放在寄存器或者栈区,所以计算类的大小不会计算this
计算类大小,是算类创建的大小,静态成员在静态区,不算
.静态数据成员之所以不计算在类的对象大小内,是因为类的静态数据成员被该类所有的对象所共享,并不属于具体哪个对象,静态数据成员定义在内存的全局区。
静态成员必须在类外初始化
10.类私有成员
静态成员创建本类私有对象
构造函数可以私有化 借助静态成员私有化
静态成员不会继承,共有的,可以通过类名访问
11.虚函数与纯虚函数
重载发生在同一作用域中
重写发生在子类父类中
12.内联函数 宏函数
宏函数 文本替换 有二义性
内联函数 是真正的函数,有参数识别,定义和声明不能分开,分开会在链接阶段出错
1.内联函数在编译时展开,宏在预编译时展开 2.在编译的时候,内联函数可以直接被镶嵌在目标代码中,而宏只是一个简单的文本替换。 3.内联函数可以完成诸如类型检测,语句是否正确等编译功能,宏就不具有这样的功能。 4.宏不是函数,inline函数是函数, 5.宏在定义时,要小心处理宏参数,否则容易出现二义性,而内联函数定义时不会出现二义性。 * 补充:内联函数本质上 就是空间换时候,代码替换------ 减少调用的开销-------增加代码量----内存增大。