CPP进阶学习。

Item 5

  • 编写一个复制和赋值函数,当需要拷贝的内容有多个(数组、对象),问题变得复杂,拷贝操作无法变成atomic,而且也面临着exception,对象的成员变量,类型也是某个对象的时候,会递归调用其他拷贝函数,也就是说,当操作的不是built-in type,就有可能抛出异常。此时拷贝操作完成了部分,处于非常尴尬的位置。
  • shadow-copy可以让拷贝变成看似原子的,再加上try-catch,避免内存泄漏(智能指针的话就可以更简单)。

Item 6

  • CPP中,临时对象无处不在,函数参数、函数返回值、类型转换,都会有临时对象的创建与销毁,很多时候是不必要的开销。
  • 类型转换还经常是explicit的,比如一个类有很多构造函数,这个类还实现了自己的一些operator,比如equal,然后使用equal的时候就伴随着explicit conversion。

Item 8

Item 10

  • 有没有想过为什么,stl里的queue、stack,查看元素和删除元素,是两个函数。也就是,为什么pop方法返回void?
  • 当pop带返回的时候,这个操作不是原子性的,或者说容易throw exception,而又没有给上层try-catch足够的空间去恢复。
1
2
3
string s1(s.pop());
string s2;
s2 = s.pop();