> 文章列表 > C++ Primer第五版_第六章习题答案(31~40)

C++ Primer第五版_第六章习题答案(31~40)

C++ Primer第五版_第六章习题答案(31~40)

文章目录

      • 练习6.31
      • 练习6.32
      • 练习6.33
      • 练习6.34
      • 练习6.35
      • 练习6.36
      • 练习6.37
      • 练习6.38
      • 练习6.39
      • 练习6.40

练习6.31

什么情况下返回的引用无效?什么情况下返回常量的引用无效?

当返回的引用的对象是局部变量时,返回的引用无效;当我们希望返回的对象被修改时,返回常量的引用无效。

练习6.32

下面的函数合法吗?如果合法,说明其功能;如果不合法,修改其中的错误并解释原因。

int &get(int *array, int index) { return array[index]; }
int main()
{int ia[10];for (int i = 0; i != 10; ++i)get(ia, i) = i;
}

合法。get 函数根据索引取得数组中的元素的引用。

练习6.33

编写一个递归函数,输出vector对象的内容。

#include <iostream>
#include <vector>using namespace std;using Iter = vector<int>::const_iterator;void print(Iter first, Iter last)
{if (first == last){cout << "over!" << endl;return;}cout << *first << " ";print(++first, last);}int main()
{vector<int> vec{ 1, 2, 3, 4, 5, 6, 7, 8, 9 };print(vec.cbegin(), vec.cend());return 0;
}

练习6.34

如果factorial 函数的停止条件如下所示,将发生什么?

if (val != 0)

如果val为正数,从结果上来说没有区别(多乘了个 1); 如果val为负数,那么递归永远不会结束。

练习6.35

在调用factorial 函数时,为什么我们传入的值是 val-1 而非 val–?

如果传入的值是 val–,那么将会永远传入相同的值来调用该函数,递归将永远不会结束。

练习6.36

编写一个函数声明,使其返回数组的引用并且该数组包含10个string对象。不用使用尾置返回类型、decltype或者类型别名。

string (&fun())[10];

练习6.37

为上一题的函数再写三个声明,一个使用类型别名,另一个使用尾置返回类型,最后一个使用decltype关键字。你觉得哪种形式最好?为什么?

typedef string str_arr[10];
str_arr& fun();auto fun()->string(&)[10];string s[10];
decltype(s)& fun();

我觉得尾置返回类型最好。

练习6.38

修改arrPtr函数,使其返回数组的引用。

decltype(odd)& arrPtr(int i)
{return (i % 2) ? odd : even;
}

练习6.39

说明在下面的每组声明中第二条语句是何含义。如果有非法的声明,请指出来。

(a) int calc(int, int);int calc(const int, const int);
(b) int get();double get();
(c) int *reset(int *);double *reset(double *);
  • (a) 非法。因为顶层const 不影响传入函数的对象,所以第二个声明无法与第一个声明区分开来。
  • (b) 非法。对于重载的函数来说,它们应该只有形参的数量和形参的类型不同。返回值与重载无关。
  • © 合法。

练习6.40

下面的哪个声明是错误的?为什么?

(a) int ff(int a, int b = 0, int c = 0);
(b) char *init(int ht = 24, int wd, char bckgrnd);		
  • (a) 正确。
  • (b) 错误。因为一旦某个形参被赋予了默认值,那么它之后的形参都必须要有默认值。