1 mutable
在C++中,mutable也是为了突破const的限制而设置的。被mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中。
该关键字修饰类中数据成员时,会释放掉non-static成员变量的bitwise constnes约束,即使在const成员函数依然可以修改该数据成员变量。
Immutable object (不可变对象) :当对象被创建后,你不能修改对象的状态以及字段。
2 C++二阶构造
【C++深度剖析教程4】C++的二阶构造模式_厚积薄发-CSDN博客
3 野指针和空悬指针
野指针:
野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)指针变量在定义时如果未初始化,其值是随机的,指针变量的值是别的变量的地址,意味着指针指向了一个地址是不确定的变量,此时去解引用就是去访问了一个不确定的地址,所以结果是不可知的。
成因:
(1)指针变量未初始化
任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。
(2)指针释放后之后未置空
有时指针在free或delete后未赋值 NULL,便会使人以为是合法的。别看free和delete的名字(尤其是delete),它们只是把指针所指的内存给释放掉,但并没有把指针本身干掉。此时指针指向的就是“垃圾”内存。释放后的指针应立即将指针置为NULL,防止产生“野指针”。
(3)指针操作超越变量作用域
不要返回指向栈内存的指针或引用,因为栈内存在函数结束时会被释放。
空指针:
#define NULL ((void *)0)
在内存分配方面,较小的地址是不用来存放数据的,也不允许程序访问的。所以,指针指向了它,就是这个指针不能操作它指向的这块较小的地址。
简单来说,空指针有指向,但是它指向的地址是特殊的,该地址不允许存放数据和不允许程序访问,所以空指针不能操作该地址里的东西,我们就理解为“指针指向了空,无法操作了”。
void * 类型指针,
这个类型指针指向了实实在在的存放数据的地址,但是该地址存放的数据的数据类型我们暂时不知道。