《C++设计与演化》 的一些片段


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,以便能够处理自我复制的问题。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值