前言
这里简单记录下
c++相关知识点
总结
C++相关
- 继承和组合,应用场景
- 菱形继承,画出内存布局《深度探索C++对象模型》,虚继承解决菱形继承的二义性 博客地址
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class A {
public:
A(int a) :_ma(a) {}
public:
int _ma;
};
class B :public A {
public:
B(int b) :A(b), _mb(b) {};
public:
int _mb;
};
class C :public A {
public:
C(int c) :A(c), _mc(c) {};
public:
int _mc;
};
class DTest :public B, public C {
public:
DTest(int d) :B(d), C(d), _md(d) {};
public:
int _md;
};
int main() {
return 0;
}cl.exe工具查看内存布局,打开vs的命令行工具,在代码目录下执行
cl [filename].cpp /d1reportSingleClassLayout[classname]
filename为文件名;classname为查看的class类名
如:cl main.cpp /d1reportSingleClassLayoutD;如果输出结果有些库中的信息,尝试去掉头文件<iostream>
- 只能在堆或只能在栈上分配类对象 博客地址
只能在堆上分配类对象,将类的析构函数设为私有,编译器无法调用析构函数释放内存,则无法在栈上建立内存
只能在栈上分配类对象,将operator new()
设为私有,即可禁止对象被new在堆上 - 常见排序算法
类别 排序方法 平均情况 最好情况 最坏情况 辅助空间 稳定性 插入排序 直接插入 O($n^2$) O($n$) O($n^2$) O($1$) 稳定 插入排序 希尔排序 O($n^{1.3}$) O($n$) O($n^2$) O($1$) 不稳定 选择排序 选择排序 O($n^2$) O($n^2$) O($n^2$) O($1$) 不稳定 选择排序 堆排序 O($n*\log_2{n})$) O($n*\log_2{n}$) O($n*\log_2{n}$) O($1$) 不稳定 交换排序 冒泡排序 O($n^2$) O($n$) O($n^2$) O($1$) 稳定 交换排序 快速排序 O($n*\log_2{n}$) O($n*\log_2{n}$) O($n^2$) O($\log_2{n}$) 不稳定 归并排序 归并排序 O($n*\log_2{n}$) O($n*\log_2{n}$) O($n*\log_2{n}$) O($n$) 稳定 基数排序 基数排序 O($d*(r+n)$) O($d*(r+n)$) O($d*(r+n)$) O($r+n$) 稳定 注:基数排序的复杂度中,r代表关键字的基数,d代表长度,n代表关键字的个数
https://www.runoob.com/w3cnote/ten-sorting-algorithm.html - c++关键字
智能指针
作用:使用对象关闭内存,避免手动new和delete
头文件:memory
auto_ptr由c++98提供,已被c++11抛弃
- auto_ptr
- unique_ptr
- shared_ptr
- weak_ptr
c++对象模型
数据结构链表
面向对象
- 三大特点
封装
继承
多态 - 五大基本原则
单一职责原则(SRP)
开放封闭原则(OCP)
里氏替换原则(LSP)
依赖倒置原则(DIP)
接口隔离原则(ISP)
四种强制类型转换
- const_cast
修改类型的const或volatile属性,去除常量性的对象必须是指针或引用
- static_cast
类似c语言的强制类型转换,用于c++内置基本数据类型的转换,类指针或引用上行转换是安全的,下行转换没有动态类型检查,是不安全的
c++ primer中说道:c++的任何的隐式转换都是使用static_cast来实现 - dynamic_cast
动态(面向对象的多态和程序运行时的状态)类型转换,不能用于内置数据类型转换,转换时基类一定含有虚函数,否则会编译报错
上行转换时效果和static_cast一样,下行转换时具备类型检查,转换失败抛出异常,比static_cast更安全 - reinterpret_cast
主要用途:1. 改变指针或引用的类型;2. 将指针或引用转换为一个足够长度的整形;3. 将整型转换为指针或引用类型
reinterpret_cast(expression) type-id 必须是一个指针、引用、算术类型、函数针或者成员指针。
它可以把一个指针转换成一个整数,也可以把一个整数转换成一个指针(先把一个指针转换成一个整数,在把该整数转换成原类型的指针)
请谨慎使用 reinterpret_cast
sizeof 空类+构造,虚析构函数,父类仅有方法+子类一个int变量
环境:windows10 + vs2019
空类+构造,
sizeof=1 ==> sizeof(class)
虚析构函数,sizeof=4 ==> sizeof(void*)
父类仅有方法+子类一个int变量,sizeof=4 ==> sizeof(int)