条款3:使容器里对象的拷贝操作轻量而正确

探讨了在C++ STL容器中添加对象时的拷贝行为,特别关注派生类对象作为基类对象拷入容器时的问题,并提出了使用指针容器的解决方案。此外,还比较了STL容器与传统数组在内存管理方面的优势。

1.容器添加对象,是将添加对象的一份拷贝;

2.拷贝派生类(通过基类的拷贝构造函数)拷贝容器的时候,对象的派生部分会被删除;例如:

当然由于继承的存在,拷贝会导致分割。那就是说,如果你以基类对象建立一个容器,而你试图插入派生类对象,那么当对象(通过基类的拷贝构造函数)拷入容器的时候对象的派生部分会被删除:

vector<Widget> vw; 
class SpecialWidget:	// SpecialWidget从上面的Widget派生
public Widget {...};
SpecialWidget sw; 
vw.push_back(sw);		// sw被当作基类对象拷入vw
			// 当拷贝时它的特殊部分丢失了

3.对于2中的缺点,使用指针容器代替对象容器,也就是说,不是建立一个Widget的容器,建立一个Widget*的容器

4.和数组对比,STL容器更文明。它们只建立(通过拷贝)你需要的个数的对象,而且它们只在你指定的时候做。STL进行了大量拷贝,但它通常设计为避免不必要的对象拷贝,实际上,它也被实现为避免不必要的对象拷贝。和C和C++内建容器的行为做个对比,下面的数组:

Widget w[maxNumWidgets];		// 建立一个大小为maxNumWidgets的Widgets数组
				// 默认构造每个元素
即使我们一般只使用其中的一些或者我们立刻使用从某个地方获取(比如,一个文件)的值覆盖每个默认构造的值,这也得构造maxNumWidgets个Widget对象。使用STL来代替数组,你可以使用一个可以在需要的时候增长的vector:

vector<Widget> vw;			// 建立一个0个Widget对象的vector
				// 需要的时候可以扩展
我们也可以建立一个可以足够包含maxNumWidgets个Widget的空vector,但没有构造Widget:
vector<Widget> vw; 
vw.reserve(maxNumWidgets);		// reserve的详细信息请参见条款14​




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值