1. 存储分配和构造函数:
这个小节也可以概括为为什么有new 和 delete运算符。
与C语言中一样,C++对象有3中分配方式:在堆栈上(在自动存储区),在固定的地址(静态存储区),以及自由空间中(在堆中,或者说是动态空间中)。所有这些情况下都必须调用构造函数,以便建立起这个对象。用C从自由空间分配一个对象时,只是涉及到调用一个分配函数,例如:
monitor * p = (monitor * ) malloc(sizeof(monitor));
那么对于C with classes显然不够,无法保证程序员一定会调用构造函数,因此引进了一个运算符,以便保证分配和初始化都能够完成。
monitor * p = new monitor();
该运算符就是new,Simula中对应运算符的名称。new将调用某种分配函数以获得存储,而后调用一个构造函数去初始化这些存储。这种组合操作常常被实例化或者简单地称为对象创建,它从原始的存储区建立起一个对象。
2. 赋值的重载:
具有非平凡表示的类,如string 或 vector,无法成功地复制,因为C语言赋值的语义(按位复制)对这些类型都是不正确的,这种默认的复制语义所创建的实际上是一种共享表示,而不是真正的副本,对这个情况的解决就是允许程序员自己描述赋值的意义。
允许为一个类的对象改变赋值的意义,实际上就提供了一种处理这类问题的方法,要做这件事需要声明一个operator=的类成员函数。
class x{
public:
int a;
class y * p;
void operator=(class x *);
};
void x.operator = (class x * from)
{
a = from->a;
delete p;
p = from-> p;
from->p = 0;
}
这样就对类X的对象定义了一个采用分解方式的读写动作。与标准语义的隐含赋值操作完全不同。
同时可能要考虑 this == from,以便能够处理自我复制的问题。