类成员函数的Big 3
- 拷贝构造 C c1=c2;或C c1(c2);
- 赋值构造 c1=c2;
- 析构 ~C();
这三个类型的成员函数在class with point members中凸显其重要性。因为对于class without point members,这三种函数在一般情况下可以不实现,而编译器会采用默认的进行处理。在拷贝构造实现需要注意self assignment,如果不对这种情况处理将引发错误。此外,对于默认构造函数,如果提供的方法使用了dereference了指针成员,需要注意预分配内存。
操作符new实际上进行了内存分配和构造函数的调用;而操作符delete会先调用析构函数再进行内存的释放。new实际上并不是完全按照类的大小进行分配的,因为还需要记录分配空间的大小。以VC来说,它使用了两个cookie记录大小。cookie本身需要先用2x4个字节,其最低位0表示已经回收了1表示已分配。而采用这个机制的前置条件是分配用的大小是16的倍数,所以会有些填充。release 和debug 模式略有些不同,debug模式会添加debug header。这也是debug 程序比较大的原因之一。
Array new必须搭配array delete使用。只用delete释放,可能造成内存泄露。因为编译器不知道释放的是一个数组,析构函数只被调用了一次。sizeof
this指针
编译器会自动为非静态成员函数插入this作为其参数,因此这些函数的实现中可以直接写成员名,编译器为会为不同的类对象添加this以获取其成员。
静态成员的意义在于表明它们是类共有的。语法上可以通过类名来找到它们(当然也可以通过对象来调用)。静态成员函数只能处理静态数据,它们没有this指针。静态成员变量必须在类外定义。
网友评论