c++基础随手记事
1、深拷贝与浅拷贝
假若没有自定义拷贝构造函数,系统会自动分配拷贝构造函数,但是这是浅拷贝
拷贝函数形式:CEexample(const CEexample& a)
拷贝函数在以下情况被调用:
a、一个对象以值传递方式传入函数体
b、一个对象以值传递方式作为结果从函数返回
c、一个对象用另一个对象做初始化
深拷贝与浅拷贝的区别
比如对象A=对象B,当成员变量需要申请内存空间时,在浅拷贝当中,A中的成员变量不会申请新的内存空间,所以A中的指针变量与B中的指针变量指向同一片内存区域,而深拷贝当中,会为A中的指针变量申请一个新的内存空间。
2、B树与B+数
一个m阶的B树满足的性质有下面几个
a、每个节点最多有m棵子树
b、根节点至少含有两颗子树(如果含有子树的情况下)
c、除了根节点以外,每个分支节点至少含有m/2棵子树
d、每个节点的关键码数量范围为[ceil(m/2),m-1] 其中ceil代表向上取整
e、所有叶节点都要在同一层
B树的插入:
插入一般在根节点,如果插入后关键字满足以上情况,最主要是d情况,直接插入
否则,则要进行分类,分裂即将假如关键字的节点根据中间分为两半,中间的关键字上移到其父节点,然后将分裂成的两半分别对应接入。如果上移父节点导致父节点不满足以上情况,就父节点继续分裂。
B树的删除:
同插入一样,如果满足条件,先看d要求,满足的话,直接删除
如果不满足,那么就向兄弟节点借:
如果兄弟节点借出后仍然满足条件,则兄弟节点借出的关键码上移到父节点,父节点相应的关键码下移到需要关键码的节点
如果兄弟节点借出以后不满足条件,那么兄弟节点就不要借给他,缺少关键码的节点直接合并到其兄弟节点,然后,父节点的关键码下放,如果这样导致父节点不满足条件,就回溯上面的删除过程。
B+树:
首先B树每个节点都存储key和data值,而B+树只是叶子节点存储data值, 并且B+树每个叶子节点加一个指向相邻节点的指针,因为B+树只有叶子节点存储data,所以其他的index节点可以存储更多的key值
3.指针和引用的定义和性质区别:
(1)指针:指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元;而引用跟原来的变量实质上是同一个东西,只不过是原变量的一个别名而已。如:
int a=1;int *p=&a;
int a=1;int &b=a;
上面定义了一个整形变量和一个指针变量p,该指针变量指向a的存储单元,即p的值是a存储单元的地址。
而下面2句定义了一个整形变量a和这个整形a的引用b,事实上a和b是同一个东西,在内存占有同一个存储单元。
(2)可以有const指针,但是没有const引用;
(3)指针可以有多级,但是引用只能是一级(int **p;合法 而 int &&a是不合法的)
(4)指针的值可以为空,但是引用的值不能为NULL,并且引用在定义的时候必须初始化;
(5)指针的值在初始化后可以改变,即指向其它的存储单元,而引用在进行初始化后就不会再改变了。
(6)"sizeof引用"得到的是所指向的变量(对象)的大小,而"sizeof指针"得到的是指针本身的大小;
(7)指针和引用的自增(++)运算意义不一样;
4、各种数据类型大小
int 4byte, long 4byte, double 8byte, float 4 byte
5、堆 和 栈 (这个以前提过了)
6、malloc和new free跟delete
简单理解 new=malloc+构造函数 delete=free+析构函数
7、那些函数不能为虚函数:
构造函数、静态函数、友元函数 (这些函数都不能被继承)
(ps:有个关键点,析构函数可以是虚函数且一般为虚函数,因为假若让子类对象赋值给父类对象的时候,父类对象被删除的时候不会调用子类的析构函数,可能会造成内存泄漏)。
8、内存对齐
每个成员变量对于结构体变量地址的偏移量正好是该成员类型所占字节的整数倍,且最终结构体占用字节的大小为类中最大的元素的整数倍。且派生类成员不会占用基类的填充字节。 注意强制对齐,gcc默认是4.
9、struct和class 的区别
在c++中,struct跟class基本没有区别,struct默认继承方式是public,而class的默认继承方式是private
10、引用是除了指针以外,另一个实现多态的方法
11、static
修饰类中变量的时候,可以不用创建类的实例,直接根据类名访问
类的全部对象共享同一个静态变量
普通静态变量, 只被初始化一次,并且默认是0
类修饰成员函数,不能被继承
12、const
修饰变量的时候
13、值传递与用传递
函数参数传递机制问题在本质上是调用函数(过程)和被调用函数(过程)在调用发生时进行通信的方法问题。基本的参数传递机制有两种:值传递和引用传递。以下讨论称调用其他函数的函数为主调函数,被调用的函数为被调函数。
值传递(passl-by-value)过程中,被调函数的形式参数作为被调函数的局部变量处理,即在堆栈中开辟了内存空间以存放由主调函数放进来的实参的值,从而成为了实参的一个副本。值传递的特点是被调函数对形式参数的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值。
引用传递(pass-by-reference)过程中,被调函数的形式参数虽然也作为局部变量在堆栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过堆栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。
转自:https://blog.csdn.net/ccblogger/article/details/77752659
14、面向对象特性:封装、继承、多态
多态的原理推荐文章:(真的是超级良心的博主)
https://blog.csdn.net/yc461515457/article/details/52658589