目录
const
作用
- 修饰变量,说明该变量不可以被改变;
- 修饰指针,分为指向常量的指针 和 自身是常量的指针(常量指针);
- 修饰引用,指向常量的引用,用于形参类型,即避免了拷贝,又避免了函数对值的修改;
- 修饰成员函数,说明该成员函数内不能修改成员变量。
常函数
成员函数 后加 const,我们称这个函数为常函数。
让常函数修改成员变量的关键字:mutable
在C++中以C语言的方式进行编译
extern C
重载和重写
函数重载
C++允许在同一个作用域中的某个函数(函数重载)和运算符指定多个定义。
- 在同一个作用域内可以声明几个功能类似的同名函数。
- 这些同名函数的形参(类型、个数、顺序)不同。
- 不能仅以函数的返回类型不同来重载函数。
函数重写
重写是指派生类中存放重新定义的函数。其函数名,参数列表,返回值类型,都必须同基类中被重写的函数一致。只有函数体不同(花括号内),派生类调用时会调用派生类的重写函数,不会调用被重写函数。
重写函数的基类中被重写的函数必须有virtual修饰。
区别
- 范围:重写和被重写的函数在不同的类中,重载和被重载的函数在同一类中。
- 参数:重写和被重写的函数参数列表一定相同,重载和被重载的函数参数列表一定不同。
- virtual:重写的基类函数必须有virtual修饰,重载和被重载函数可以被virtual修饰,也可以没有。
C++比较器
- struct重载运算符()
- class重载运算符()
- 定义函数
- lambda表达式
- function包装lambda表达式
转载:
c++优先队列priority_queue(自定义比较函数)_c++优先队列自定义比较_菊头蝙蝠的博客-CSDN博客
在堆区创建一个五个对象的数组
class A{
public:
A(int a){
}
}
int main(){
A* p = new A[5] {A(1), A(2), A(3), A(4), A(5)};
return 0;
}
初始化参数列表
引用类型和常量类型的成员变量必须使用初始化参数列表。
- 引用类型:引用必须在定义的时候初始化,并且不能重新赋值
- 没有默认构造函数的类类型,因为使用初始化列表可以不必调用默认构造函数来初始化。
更高效:少了一次调用默认构造函数的过程。
决定参数初始化顺序的因素
- 跟参数列表的初始化顺序无关
- 取决于声明对象的顺序
结构体对齐规则
- 保证最长成员对齐
- 保证整数倍地址对齐
- 结构体变量的首地址能够被其最宽类型成员的大小所整除。
- 结构体每个成员相对结构体首地址的偏移量都是成员大小的整数倍。
- 结构体的总大小为结构体最宽基本类型成员大小的整数倍。
struct s{
char b;
short a;
char c;
int d;
};
//sizeof(struct s) == 12;
struct ss{
char b;
char c;
short a;
int d;
};
//sizeof(struct ss) == 8;
assert如何使用
assert宏的原型定义在<assert.h>中,被C/C++用来判断某些条件是否成立。
assert的函数申明如下:
void assert( int expression );
int main(){
int num = 1;
assert(num == 1); //true,断言成功
num = 10;
assert(num == 1); //false,断言失败
return 0;
}
内存泄漏
申请了一块内存空间,使用完毕后没有释放掉。
出现内存泄漏的情况
- new和malloc申请资源使用后,没有用delete和free释放。
- 子类继承父类时,父类析构函数不是虚函数。
- 浅拷贝
如何检测内存泄漏,如何实现一个内存泄漏的程序
内存泄漏就是new出来的内存没有通过delete合理的释放掉。new和delete这两个函数就是关键点。可以重载new和delete,每次new中开辟一块内存就用链表把这个内存的信息保存下来,每次用delete删除一块内存就从链表中删除这块内存的记录。(也可以将链表换成哈希表)。