6.9
编写你自己的fact.cc和factMain.cc,这两个文件都应该包含上一节的练习中编写的Chapter6.h头文件,通过这些文件,理解你的编译器如何支持分离式编译。
答:
factMain.cc
#include<iostream>#include<string>#include<vector>#include<map>#include"Chapter6.h";
using namespace std;intmain(){
cout <<fact(5)<< endl;return0;};
fact.cc
#include"Chapter6.h"intfact(int n){if(n ==1)return1;return n *fact(n -1);}
参数传递
6.2.1节练习
6.10
编写一个函数,使用指针形参交换两个整数的值,在代码中使用该函数并输出交换后的结果,以此验证函数的正确性。
答:
#include<iostream>#include<string>#include<vector>#include<map>#include"Chapter6.h";
using namespace std;voidmy_swap(int* a,int* b){int temp =*a;*a =*b;*b = temp;}intmain(){int a =3, b =5;
cout << a <<" "<< b << endl;my_swap(&a,&b);
cout << a <<" "<< b << endl;return0;};
6.21
编写一个函数,令其接受两个参数:一个是Int型指针,一个是int型数。函数比较int值和int指针指向的值,返回较大的那个,在这函数中指针的类型应该为什么。
答:
#include<iostream>#include<string>#include<vector>#include<map>#include"Chapter6.h";
using namespace std;intbig(constint a,constint* b){return a >*b ? a :*b;}intmain(){int a =9, b =10;
cout <<big(a,&b);return0;};6.22
编写一个函数,令其交换两个Int指针。
答:
#include<iostream>#include<string>#include<vector>#include<map>#include"Chapter6.h";
using namespace std;voidmy_swap(int*&a,int*&b){int* temp = a;
a = b;
b = temp;}intmain(){int a =7, b =10;int*p =&a,*q =&b;my_swap(p, q);return0;};6.23
参考本节的几个print函数,根据理解编写自己的版本,以此调用函数使其输入下面定义的i和j
int i=0,j[2]={0,1};
答:
#include<iostream>#include<string>#include<vector>#include<map>#include"Chapter6.h";
using namespace std;voidprint(constint* p,int size,constint size_num){if(p){while(size)
cout <<*p++, size -= size_num;}
cout << endl;return;}intmain(){int i =0;int j[2]={0,1};print(&i,sizeof(i),sizeof(int));print(j,sizeof(j),sizeof(int));return0;};6.24
描述下面这个函数的问题,如果代码中存在问题,请指出并指正。
voidprint(constint ia[10]){for(size_t i=0;i!=20;++i){
cout<<ia[i]<<endl;}}
答:指针越界了
6.2.5节练习
6.25
编写一个main函数,令其接受两个实参,把实参的内容连接成一个string对象并输出出来。
答:
#include<iostream>
using namespace std;intmain(int argc,int**argv){
string s;for(int i =1; i !=3;++i)
s += argv[i];return0;};6.26
编写一个程序,使其接受本文所示的选项,输出传递给main函数实参的内容。
答:
#include<iostream>
using namespace std;intmain(int argc,int**argv){
string s;for(int i =1; i != argc;++i)
s += argv[i];return0;};
6.2.6节练习
6.27
编写一个函数,它的参数是initializer_list<int>类型的对象,函数的功能是计算列表中的所有元素的值。
答:
#include<iostream>
using namespace std;intmy_sum(initializer_list<int>num){int sum =0;for(auto& nums : num){
sum += nums;}return sum;}intmain(){
cout <<my_sum({1,2,3,4})<< endl;return0;};6.28
在error_msg函数中的第二个版本中中包含ErrorCode类型的参数,其中循环的elem是什么类型。
答:
const string&类型
6.29
在范围for循环中使用initializer_list对象时,应该将循环控制变量声明为引用类型吗?
答:都差不多,反正initializer_lsit中元素是常量,不可改变。