练习6.10
编写一个函数,使用指针形参交换两个整数的值。在代码中调用该函数并输出交换后的记过,以此验证函数的正确性。
解答:
#include <iostream>
using namespace std;
void swap(int *a, int *b){
int *p = a;
*a = *b;
*b = *p;
}
int main(){
int a = 10, b = 20;
swap(a, b);
cout << a << endl;
cout << b << endl;
return 0;
}
练习6.11
编写并验证你自己的reset函数,使其作用于引用类型的参数。
解答:
这个参照书中的实现。
练习6.12
改写6.2.1节中练习6.10的程序,使用引用而非指针交换两个整数的值。你觉得那种方法更易于使用呢?为什么?
解答:
#include <iostream>
using namespace std;
void swap(int &a, int &b){
int p = a;
a = b;
b = p;
}
int main(){
int a = 10, b = 20;
swap(a, b);
cout << a << endl;
cout << b << endl;
return 0;
}
引用更容易理解一些。
指针需要做拷贝,而且指针用不好可能会带来很多奇怪的问题。
练习6.13
假设T是某种类型的名字,说明以下两个函数声明的区别:一个是void f(T), 另一个是void f(&T).
解答:
返回值类型不同,一个是void,一个是void*。
一个参数是拷贝传参,一个是引用传参。
练习6.14
举一个形参应该是引用的例子,再举一个形参不能是引用的例子。
解答:
这里就不写了。
这里用到引用的话,首先是为了效率,这样不会再去开辟新的内存空间去存储拷贝;
其次,还是为了方便直接对参数数值进行修改。
这个不能是引用的例子还真没想到……
练习6.15
说明find_char函数中的三个形参为什么是现在的类型,特别说明为什么s是常量引用而occurs是普通引用?为什么s和occurs是引用类型而c不是?如果令s是普通引用会发生什么情况?如果令occurs是常量引用会发生什么情况
解答:
(1)这里我们希望对occurs进行计数,也就是对其要进行修改。同时,这里我们不希望s在函数调用过程中有任何的变化,所以两个引用的类型不一样。
(2)这里c可以是const char&类型的引用。可能因为char的内存占用比较小,所以这里没有对其进行引用传递。
(3)可能会在函数调用过程中被修改,与我们之前的字符串不相同。
(4)无法进行计数,常量引用的话就无法进行写入。
同样的,常量引用的设置也是一种警告机制,通过编译错误信息来警告程序员,有不必要的修改在某个函数里面。