7.1
形参是函数的局部变量,被实参初始化,在函数被调用的那一刻创建并初始化,调用结束就会撤销。
实参是函数的调用者用来传递给函数的参数。
实参和形参的类型必须一致或者实参能够转型为形参的类型。
7.2
(a) 返回值不对,应该是返回int类型
(b) 没有指定返回值
(c) 函数体缺少左括号
(d) 函数体没有左右括号
7.3
#include <iostream>
#include <string>
#include <vector>
#include <typeinfo>
#include <cassert>
#include <cmath>
using namespace std;
int mypow(int a, int b) {
return pow(a, b);
}
int main() {
int a, b;
cin >> a >> b;
printf("%d\n", mypow(a, b));
return 0;
}
7.4
#include <iostream>
#include <string>
#include <vector>
#include <typeinfo>
#include <cassert>
#include <cmath>
using namespace std;
int myabs(int a) {
return abs(a);
}
int main() {
int a;
cin >> a;
printf("%d\n", myabs(a));
return 0;
}
7.5
如果只是考虑比较两个int的大小,那么形参应该是const int i。
#include <iostream>
int max(int a, int* b) {
if(a>=*b)
return a;
else
return *b;
}
int main() {
int v = 2;
int* p = &v;
std::cout << max(1, p);
return 0;
}
7.6
#include <iostream>
void max(int* a, int* b) {
int tmp = *a;
*a = *b;
*b = tmp;
}
int main() {
int* a = new int(1);
int* b = new int(2);
max(a, b);
std::cout << *a << "\t" << *b;
return 0;
}
7.7
void f(T); // 传值,副本
void f(T&); //传引用,别名
7.8
什么时候适合将形参定义为引用类型?
- 需要修改实参,比如swap函数
- 实参过大,拷贝成本太高,比如实参是大数组
- 实参不能复制拷贝,比如类设置拷贝构造函数=delete
什么时候不适合将形参定义为引用类型?
todo
7.9
实参occurs不会修改。修改的只是副本,遂函数结束消亡。
7.10
bool teset(const string& s) {
return s.empty();
}
7.11
不会修改形参的时候。如果定义成非const引用,会限制函数的调用
- 不能用const对象初始化
- 不能用字面值常量初始化
- 不能用产生右值的表达式初始化
7.12
什么时候应使用指针形参?
- 数组作为形参
- 直接内存访问,比如大块内存不拷贝,直接传地址,常见于嵌入式开发
- 其他不适合引用形参的地方
什么时候应使用引用形参
参考7.8
指针更灵活,引用更自然和安全。
7.13
sum1是字符数组风格
sum2是标准库风格
sum3是C风格
#include <iostream>
#include <string>
using namespace std;
int sum1(int* arr) {
int i(0);
int sum(0);
while (arr[i]) {
if(arr[i] == '\0')
break;
sum += arr[i++];
}
return sum;
}
int sum2(int* begin, int* end) {
// printf("%p %p\n", begin, end);
int sum