练习6.11
1 void reset(int &num) 2 { 3 num = 0; 4 } 5 6 int main() 7 { 8 int num1; 9 while (cin >> num1) 10 { 11 reset(num1); 12 cout << num1 << endl; 13 } 14 system("pause"); 15 return 0; 16 }
练习6.12
1 void exchange_num(int &num,int &num1) 2 { 3 int temp; 4 temp = num; 5 num = num1; 6 num1 = temp; 7 } 8 9 int main() 10 { 11 int a1,a2; 12 while (cin >> a1 >> a2) 13 { 14 exchange_num(a1, a2); 15 cout << a1 << " " << a2 << endl; 16 } 17 system("pause"); 18 return 0; 19 }
使用引用比指针交换要简单,因为我们直接传入的是对象而不是对象的地址,也不需要新建两个指针分别指向两个对象。
练习6.13
void f(T):实参传过来,作用范围仅在函数内部,本身实参没有变化。
void f(&T):引用的形参绑定了实参,一旦引用的形参发生变化,实参也会跟着变化。
练习6.14
如果需要改变传入实参的值的话,就使用引用。
练习6.15
s是string类型的,可能会比较长,应该尽量避免使用直接拷贝,应该使用引用形参是比较好的选择,而s在程序中并不需要改变,所以使用常量引用;c是要找的字符,string类型可以看做是数组存放,其中每一个元素存放的类型应该是字符类型,occurs统计c出现的次数,需要改变其值,且需要通过occurs将其值隐含的传递出去。所以应该是size_type类型的引用类型。如果s是普通引用,则s在函数中可以被改变。如果occurs是常量引用,他的值就将会是实参的值不会再次改变。
1 string::size_type find_char(const string &s, char c, string::size_type &occurs) 2 { 3 string::size_type ret = s.size(); 4 occurs = 0; 5 for (decltype(ret) i = 0; i != s.size(); ++i) 6 { 7 if (s[i] == c) 8 { 9 if(ret == s.size()) 10 ret = i; 11 ++occurs; 12 } 13 } 14 return ret; 15 } 16 17 int main() 18 { 19 string s{ "asdfghjklqwaeryto" }; 20 char c = 'a'; 21 string::size_type sum = 5; 22 auto j = find_char(s, c, sum); 23 cout << j << " " << sum << endl; 24 system("pause"); 25 return 0; 26 }