条款3:使容器里对象的拷贝操作轻量而正确
容器容纳了对象,但不是你给它们的那个对象。此外,当你从容器中获取一个对象时,你所得到的对象不是容器里的那个对象。取而代之的是,当你向容器中添加一个对象(比如通过insert或push_back等),进入容器的是你指定的对象的拷贝。当你从容器中获取一个对象时(比如通过front或back),你取到的是容器中那个对象的拷贝。拷进去,拷出来。这就是STL的方式。
一旦一个对象进入一个容器,以后对它的拷贝并不少见。如果你从vector、string或deque中插入或删除了什么,现有的容器元素会移动(拷贝)(参见条款5和14)。如果你使用了任何排序算法(参见条款31):next_permutation或者previous_permutation;remove、unique或它们的同类(参见条款32);rotate或reverse等,对象会移动(拷贝)。是的,拷贝对象是STL的方式。
你可能会对所有这些拷贝是怎么完成的感兴趣。这很简单,一个对象通过使用它的拷贝成员函数来拷贝,特别是它的拷贝构造函数和它的拷贝赋值操作符(很好的名字,不是吗?)。对于用户自定义类,比如Widget,这些函数传统上是这么声明的:
class Widget { public: ... Widget