练习 6.21 编写一个函数,令其接受两个参数:一个是int
型的数,另一个是int
指针。函数比较int
的值和指针所指的值,返回较大的那个。在该函数中指针的类型应该是什么?
int maxxorp(const int x,const int *p) {
return (x > *p) ? x : *p;
}
应该是const int *
类型
练习 6.22 编写一个函数,令其交换两个int
指针。
#include<iostream>
using namespace std;
void swapp(int *(&x), int *(&y)) {
int *temp = x;
x = y;
y = temp;
}
int main()
{
int a = 10, b = 20;
int *pa = &b, *pb = &a;
cout << *pa << " " << *pb << endl;
swapp(pa, pb);
cout << *pa << " " << *pb << endl;
return 0;
}
练习 6.23 参考本节介绍的几个print
函数,根据理解编写你自己的版本。依次调用每个函数使其输入下面定义的i和j:
#include<iostream>
#include<iterator>
using namespace std;
void print(const int &x) {
cout << x << endl;
}
void print(const int *beg, const int *end) {
auto iter = beg;
for (;iter < end;++iter) {
cout << *iter << " ";
}
cout << endl;
}
int main()
{
int i = 0, j[2] = { 0, 1 };
print(i);
print(begin(j), end(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)
{
for (size_t i = 0; i != 10; ++i)
cout << ia[i] << endl;
}
由于传入的ia指向的空间大小不明,有可能会发生数组越界。
可以改为
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>
using namespace std;
int main(int argc, char **argv)
{
string s(argv[1]);
string t(argv[2]);
cout << s+t << endl;
return 0;
}
练习 6.26 编写一个程序,使其接受本节所示的选项;输出传递给main
函数的实参内容。
#include<iostream>
#include<string>
using namespace std;
int main(int argc, char **argv)
{
string str;
for (int i = 1; i != argc; ++i)
str = str + string(argv[i]) + " ";
cout << str << endl;
return 0;
}
练习 6.27 编写一个函数,它的参数是initializer_list
类型的对象,函数的功能是计算列表中所有元素的和。
#include<iostream>
#include<string>
using namespace std;
int sum(initializer_list<int> lst) {
int sm = 0;
for (auto &x : lst)
sm += x;
return sm;
}
int main(int argc, char **argv)
{
cout << sum({ 1,2,3,4,7 }) << endl;
cout << sum({ 1,7 }) << endl;
return 0;
}
练习 6.28 在error_msg
函数的第二个版本中包含ErrCode
类型的参数,其中循环内的elem
是什么类型?
elem
是const string &
类型的。
练习 6.29 在范围for
循环中使用initializer_list
对象时,应该将循环控制变量声明成引用类型吗?为什么?
我认为使用auto的时候应该声明为常量引用,因为其值不可更改,直接使用其引用就可。
练习 6.30 编译第200页的str_subrange
函数,看看你的编译器是如何处理函数中的错误的。
错误信息:(VS2017)
源.cpp(10): error C2561: “str_subrange”: 函数必须返回值