条款3:使容器里对象的拷贝操作轻量而正确
2017-12-02 12:04
344 查看
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++内建容器的行为做个对比,下面的数组:
vector<Widget> vw; // 建立一个0个Widget对象的vector
// 需要的时候可以扩展我们也可以建立一个可以足够包含maxNumWidgets个Widget的空vector,但没有构造Widget:
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
相关文章推荐
- 条款3:使容器里对象的拷贝操作轻量而正确
- 条款3:使容器里对象的拷贝操作轻量而正确
- 使容器里对象的拷贝操作轻量而正确
- 使容器里对象的拷贝操作轻量而正确
- 《Effective STL》 03 确保容器中的对象拷贝正确而高效
- 第3条:确保容器中的对象拷贝正确而高效
- 容器中的对象拷贝
- vb6.0 office excel 和wps共存,创建正确的excel对象以便操作excel表格
- Effective STL 第7条:如果容器中包含了通过new操作创建的指针,切记在容器对象析构前将指针delete掉
- C++对象的拷贝与赋值操作
- STL容器中 存放指针与对象区别 遍历删除与释放操作
- C++ STL 如何安全的将一个含有指针变量的类对象放在容器中? 避免浅拷贝问题
- C++之模板类(Template) 容器之map 及 对象副本 深/浅拷贝 等问题
- 普通构造、拷贝构造、对象赋值操作运算符重载的代码实例
- Newlife.XCode对象容器与接口操作实例
- C++对象的拷贝与赋值操作
- C++模板类 容器之map 及 对象副本 深/浅拷贝 等问题
- C++对象的拷贝与赋值操作
- Java如何实现文件拷贝操作和如何正确关闭资源
- 由C++ STL的vector容器中存储的对象拷贝引起的对capacity属性 的理解