《C++ primer》--第三章

时间:2022-04-22
本文章向大家介绍《C++ primer》--第三章,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

习题3.2 什么是默认构造函数?

解答:

     默认构造函数就是在没有显示提供初始化式时调用的构造函数。它由不带参数的构造函数,或者为所有形参提供默认实参的构造函数定义。如果定义某个类的变量时没有提供初始化式,就会使用默认构造函数。

    如果用户定义的类中没有显示定义任何构造函数,编译器就会自动为该类生成默认构造函数,称为合成的默认构造函数。

习题3.3 列举出三种初始化string对象的方法。

解答:

  1. 不带初始化式,使用默认构造函数初始化string对象。
  2. 使用给一个已存在的string对象作为初始化式,将新创建的string对象初始化为已存在对象的副本。
  3. 使用字符串字面值作为初始化式,将新创建的string对象初始化为字符串字面值的副本。

习题3.5 解释string类型的输入操作符和getline函数分别如何处理空白字符。

解答:

string类型的输入操作符对空白字符的处理:读取并忽略有效字符(非空白字符)之前所有的空白字符,然后读取字符直至再次遇到空白字符,读取终止(该空白字符仍留在输入流中)。

getline函数对空白字符的处理:不忽略行开头的空白字符,读取字符直至遇到换行符,读取终止并丢弃换行符(换行符从输入流中去掉但并不存储在string对象中)。

习题3.21 何时使用const迭代器?何时使用const_iterator?解释两者的区别?

  • const迭代器是迭代器常量,该迭代器本身的值不能修改,即该迭代器在定义时需要初始化,而且初始化之后,不能再指向其他元素。若需要指向固定元素的迭代器,则可以使用const迭代器。const迭代器这种类型几乎没什么用处:一旦它被初始化后,只能用它来改写其指向的元素,但不能使它指向任何其他元素。
  • const_iterator是一种迭代器类型,对这种类型的迭代器解引用会得到一个指向const对象的引用,即通过这种迭代器访问到得对象是常量。该对象不能修改,因此,const_iterator类型只能用于读取容器内的元素,不能修改元素的值。若只需遍历容器中的元素而无需修改它们,则可以使用const_iterator。

P103 对指针进行初始化或赋值只能使用以下四种类型的值

  1. 0值常量表达式,例如,在编译时可获得0值的整形const对象或字面值常量0.
  2. 类型匹配的对象的地址。
  3. 另一对象之后的下一地址。
  4. 同类型的另一个有效指针。

p140 为什么使用前自增操作?

有使用C语言背景的读者可能会觉得奇怪,为什么要在程序中使用前自增操作。道理很简单:因为前置操作需要做的工作更少,只需加1返回加1后的结果即可。而后置操作符则必须先保存操作数原来的值,以便返回未加1之前的值作为操作的结果。对于int型对象和指针,编译器可优化掉这项额外工作。但是对于更多的复杂迭代器类型,这种额外工作可能会花费更大的代价。因此,养成使用前置操作这个好习惯,就不必担心性能差异的问题。

前自增操作和后自增操作都使其操作数加1,二者的区别在于:

  • 前自增操作将修改后操作数的值作为表达式的结果值;
  • 而后自增操作将操作数原来的、未修改的值作为表达式的结果值。

P154 如果赋值操作的左右操作数类型不同,则右操作数会被转换为左边的类型。