C++ Primer第五版_第六章习题答案(21~30)
文章目录
- 练习6.21
- 练习6.22
- 练习6.23
- 练习6.24
- 练习6.25
- 练习6.26
- 练习6.27
- 练习6.28
- 练习6.29
- 练习6.30
练习6.21
编写一个函数,令其接受两个参数:一个是int型的数,另一个是int指针。函数比较int的值和指针所指的值,返回较大的那个。在该函数中指针的类型应该是什么?
#include <iostream>
using std::cout;int larger_one(int i, const int *p)
{return (i > *p) ? i : *p;
}int main()
{int i = 6;cout << larger_one(7, &i);return 0;
}
应该是 const int *
类型。
练习6.22
编写一个函数,令其交换两个int指针。
#include <iostream>
#include <string>void swap(int*& lft, int*& rht)
{auto tmp = lft;lft = rht;rht = tmp;
}int main()
{int i = 42, j = 99;auto lft = &i;auto rht = &j;swap(lft, rht);std::cout << *lft << " " << *rht << std::endl;return 0;
}
练习6.23
参考本节介绍的几个print函数,根据理解编写你自己的版本。依次调用每个函数使其输入下面定义的i和j:
int i = 0, j[2] = { 0, 1 };
#include <iostream>
using std::cout; using std::endl; using std::begin; using std::end;void print(int i)
{cout << i << endl;
}void print(const int *beg, const int *end)
{while (beg != end)cout << *beg++ << endl;
}void print(const int ia[], size_t size)
{for (size_t i = 0; i != size; ++i){cout << ia[i] << endl;}
}void print(int (&arr)[2])
{for (auto i : arr)cout << i << endl;
}int main()
{int i = 0, j[2] = { 0, 1 };print(i);print(begin(j), end(j));print(j, end(j) - begin(j));print(j);return 0;
}
练习6.24
描述下面这个函数的行为。如果代码中存在问题,请指出并改正。
void print(const int ia[10])
{for (size_t i = 0; i != 10; ++i)cout << ia[i] << endl;
}
当数组作为实参的时候,会被自动转换为指向首元素的指针。因此函数形参接受的是一个指针。如果要让这个代码成功运行,可以将实参改为数组的引用。
void print(const int (&ia)[10])
{for (size_t i = 0; i != 10; ++i)cout << ia[i] << endl;
}
练习6.25
编写一个main函数,令其接受两个实参。把实参的内容连接成一个string对象并输出出来。
#include <iostream>
#include <string>int main(int argc, char **argv)
{std::string str;for (int i = 1; i != argc; ++i)str += std::string(argv[i]) + " ";std::cout << str << std::endl;return 0;
}
练习6.26
编写一个程序,使其接受本节所示的选项;输出传递给main函数的实参内容。
#include <iostream>
#include <string>int main(int argc, char **argv)
{std::string str;for (int i = 1; i != argc; ++i)str += std::string(argv[i]) + " ";std::cout << str << std::endl;return 0;
}
练习6.27
编写一个函数,它的参数是initializer_list类型的对象,函数的功能是计算列表中所有元素的和。
#include <iostream>
#include <initializer_list>int sum(std::initializer_list<int> const& il)
{int sum = 0;for (auto i : il) sum += i;return sum;
}int main(void)
{auto il = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };std::cout << sum(il) << std::endl;return 0;
}
练习6.28
在error_msg函数的第二个版本中包含ErrCode类型的参数,其中循环内的elem是什么类型?
elem
是 const string &
类型。
练习6.29
在范围for循环中使用initializer_list对象时,应该将循环控制变量声明成引用类型吗?为什么?
应该使用常量引用类型。initializer_list
对象中的元素都是常量,我们无法修改initializer_list
对象中的元素的值。
练习6.30
编译第200页的str_subrange函数,看看你的编译器是如何处理函数中的错误的。
错误信息(vs2013):
错误 1 error C2561: “str_subrange”: 函数必须返回值