题目:
解释为什么下面程序的交换函数没有把形参 x 和 y 所对应的实参的值交换。如何修改代码,使实参的值得到交换?
原交换程序:
1 void swap(int x, int y) { 2 int temp = x; 3 x = y; 4 y = temp; 5 }
思路:
在C++中,参数传递方式有三种,分别为传值,传地址,传引用。在以上程序中,是按照传值的方式进行的。在实参传入时,将副本给形参。(如果是内置数据类型,则进行复制;如果是用户自定义数据类型,则调用复制构造函数)。传值不会改变实参,想要改变实参,则应该传指针或引用。这里我选择传引用。
修改后的程序:
1 template <typename T> 2 void new_swap(T& a, T& b) { 3 T temp = a; 4 a = b; 5 b = temp; 6 }
在上面修改后的程序里,有几个地方需要解释。
第一,返回值为 void,因为进行交换不需要返回值。
第二,temp 的类型为 T,而不是 T&,因为 a 是一个 T 类型的,并且 a 是一个引用,所以 temp 也为 T 类型。
代码:
1 #include <iostream> 2 using namespace std; 3 4 template <typename T> 5 void new_swap(T& a, T& b) { 6 T temp = a; 7 a = b; 8 b = temp; 9 } 10 11 int main() { 12 int int_a, int_b; 13 cout << "Enter two int : "; 14 cin >> int_a >> int_b; 15 cout << "Before swap : " << int_a << " " << int_b << endl; 16 new_swap(int_a, int_b); 17 cout << "After swap : " << int_a << " " << int_b << endl; 18 19 string str1, str2; 20 cout << "Enter two string : "; 21 cin >> str1 >> str2; 22 cout << "Before swap : " << str1 << " " << str2 << endl; 23 new_swap(str1, str2); 24 cout << "After swap : " << str1 << " " << str2 << endl; 25 26 return 0; 27 }