C++ Primer 中文版(第 5 版)练习解答合集
自己写的解答,如有错误之处,烦请在评论区指正!
- 实参是值,是一个主调函数传递给被调函数的值,并且是形参的初始值。
- a. 函数返回类型应该改成
string
b. 没有写返回类型,如果没有返回类型应该写void
c. 两个形参的名字不能相同
d. 函数体没有花括号。
#include <iostream>
using namespace std;
int fact(int n) {
if (n < 2) return 1;
else return n * fact(n - 1);
}
int main() {
for (int i = 1; i != 10; ++i)
cout << "fact(" << i << ") = " << fact(i) << endl;
return 0;
}
#include <iostream>
using namespace std;
int fact(int n) {
if (n < 2) return 1;
else return n * fact(n - 1);
}
int main() {
int i;
while (cin >> i)
cout << "fact(" << i << ") = " << fact(i) << endl;
return 0;
}
void printAbs(int n) {
cout << (n > 0 ? n : -n);
}
- 形参属于局部变量(形参和函数体内部定义的变量统称为局部变量),而局部变量又可以分为自动对象(生命周期只存在于块执行期间)和局部静态变量(在程序执行路径第一次经过对象定义语句时初始化,直到程序终止时才被销毁),形参是一种自动对象。
int cntMyself(void) {
static int cnt = 0;
return cnt++;
}
- 略
- 略
#include <iostream>
using namespace std;
void mySwap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
int main() {
int a = 5, b = 2;
mySwap(&a, &b);
cout << "a = " << a << ", b = " << b << endl;
return 0;
}
void reset(int &i) {
i = 0;
}
- 引用真香!调用的时候不用取地址,写函数体的时候不用解引用。
#include <iostream>
using namespace std;
void mySwap(int &a, int &b) {
int temp = a;
a = b;
b = temp;
}
int main() {
int a = 5, b = 2;
mySwap(a, b);
cout << "a = " << a << ", b = " << b << endl;
return 0;
}
- 勘误?
void f(T&)
表示传引用参数。 - 形参应该是引用:希望函数修改主调函数里对象的值的时候;
形参不能是引用:函数在函数体内修改了形参的值,并且主调函数不希望对象的值被修改的时候。 s
是string
类型,可能会很长,所以使用引用 避免拷贝,同时我们不希望函数体改变s
的值,所以加上const
前缀;对于c
,函数只关心它的值是什么,所以普通地进行值传递就可以了;对于occurs
,我们用引用的方法隐式地返回字符出现的次数。
如果s
是普通引用的话存在s
的值被修改的风险。
如果occurs
是常量引用的话,其值就不能被修改,也就无法统计字符出现的次数。- 因为这个函数并不修改
s
的值,所以应该使用常量引用:
bool is_empty(const string &s) { return s.empty(); }
- 形参类型不同,因为
containUpper
不用修改字符串,而stringToLower
要修改。
bool containUpper(const string &s) {
for (auto ch : s)
if (isupper(ch))
return true;
return false;
}
void stringToLower(string &s) {
for (auto &ch : s)
ch = tolower(ch);
}
- a.
bool compare(matrix &a, matrix &b);
功能:比较两个矩阵是否相等
b.vector<int>::iterator change_val(int x, vector<int>::iterator it);
功能:修改迭代器指向元素的值为x
并返回该迭代器。 - a. 不合法。变量过多;
b. 合法;
c. 合法;
d. 合法。 - 不会改变的形参都应该是常量引用(尽量用常量引用)。首先会给函数调用者形参可能会被改变的错觉,其次在被别的函数调用的时候,如果别的函数传进来了常量实参会出现错误。
int bigger(int a, int *b) {
return a > *b ? a : *b;
}
void swapPointer(int **a, int **b) {
int *temp = *a;
*a = *b;
*b = temp;
}
- 略
- 正确地传递一个具有 10 个整数的数组引用:
void print(const int (&ia)[10]);
#include <iostream>
using namespace std;
int main(int argc, char *argv[]) {
if (argc != 3) {
cerr << "Please input two arguments." << endl;
return 1;
}
string output = argv[1];
output += argv[2];
cout << output << endl;
return 0;
}
#include <iostream>
using namespace std;
int main(int argc, char *argv[]) {
if (argc < 1) {
cerr << "Please input at least one arguments." << endl;
return 1;
}
for (int i = 0; i != argc; ++i)
cout << "argv[" << i << "] = \"" << argv[i] << "\"" << endl;
return 0;
}