习题3.2 什么是默认构造函数?
解答:
默认构造函数就是在没有显示提供初始化式时调用的构造函数。它由不带参数的构造函数,或者为所有形参提供默认实参的构造函数定义。如果定义某个类的变量时没有提供初始化式,就会使用默认构造函数。
如果用户定义的类中没有显示定义任何构造函数,编译器就会自动为该类生成默认构造函数,称为合成的默认构造函数。
习题3.3 列举出三种初始化string对象的方法。
解答:
- 不带初始化式,使用默认构造函数初始化string对象。
- 使用给一个已存在的string对象作为初始化式,将新创建的string对象初始化为已存在对象的副本。
- 使用字符串字面值作为初始化式,将新创建的string对象初始化为字符串字面值的副本。
习题3.5 解释string类型的输入操作符和getline函数分别如何处理空白字符。
解答:
string类型的输入操作符对空白字符的处理:读取并忽略有效字符(非空白字符)之前所有的空白字符,然后读取字符直至再次遇到空白字符,读取终止(该空白字符仍留在输入流中)。
getline函数对空白字符的处理:不忽略行开头的空白字符,读取字符直至遇到换行符,读取终止并丢弃换行符(换行符从输入流中去掉但并不存储在string对象中)。
习题3.21 何时使用const迭代器?何时使用const_iterator?解释两者的区别?
- const迭代器是迭代器常量,该迭代器本身的值不能修改,即该迭代器在定义时需要初始化,而且初始化之后,不能再指向其他元素。若需要指向固定元素的迭代器,则可以使用const迭代器。const迭代器这种类型几乎没什么用处:一旦它被初始化后,只能用它来改写其指向的元素,但不能使它指向任何其他元素。
- const_iterator是一种迭代器类型,对这种类型的迭代器解引用会得到一个指向const对象的引用,即通过这种迭代器访问到得对象是常量。该对象不能修改,因此,const_iterator类型只能用于读取容器内的元素,不能修改元素的值。若只需遍历容器中的元素而无需修改它们,则可以使用const_iterator。
P103 对指针进行初始化或赋值只能使用以下四种类型的值:
- 0值常量表达式,例如,在编译时可获得0值的整形const对象或字面值常量0.
- 类型匹配的对象的地址。
- 另一对象之后的下一地址。
- 同类型的另一个有效指针。
p140 为什么使用前自增操作?
有使用C语言背景的读者可能会觉得奇怪,为什么要在程序中使用前自增操作。道理很简单:因为前置操作需要做的工作更少,只需加1返回加1后的结果即可。而后置操作符则必须先保存操作数原来的值,以便返回未加1之前的值作为操作的结果。对于int型对象和指针,编译器可优化掉这项额外工作。但是对于更多的复杂迭代器类型,这种额外工作可能会花费更大的代价。因此,养成使用前置操作这个好习惯,就不必担心性能差异的问题。
前自增操作和后自增操作都使其操作数加1,二者的区别在于:
- 前自增操作将修改后操作数的值作为表达式的结果值;
- 而后自增操作将操作数原来的、未修改的值作为表达式的结果值。
P154 如果赋值操作的左右操作数类型不同,则右操作数会被转换为左边的类型。