16.6 以值存放对象
实际上,如果我们没有模板,那么在一个一般的容器内创建对象的一个拷贝是一个复杂的问题。使用模板,事情就相对简单了,只要说我们存放对象而不是指针就行了。
用于被包含对象的拷贝构造函数通过按值传递和返回对象来做大部分工作。在push()内,对象在Stack数组上的对象存储是用T:operator=完成的。为了保证工作,一个称为SelfCounter的类将跟踪对象创建和拷贝构造。
当创建一个Stack容器时,对于数组中的每个对象调用被包含对象的默认构造函数。最初将看到100个SelfCounter对象被创建,但是,这只是这个数组的初始化。这样的代价可能有点昂贵,但是在像这样的简单设计中没有办法。如果允许Stack的规模动态增长,让它更一般化,就会出现更复杂的情况,因为在上面显示的实现中会包括:创建一个新的(更大)的数组,拷贝老的数组给新的数组,销毁这个老的数组(事实上,这是标准C++库函数vector类所做的事情)。