题目:
解释为什么下面程序的交换函数没有把形参 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 }
来源:https://www.cnblogs.com/Hello-Nolan/p/12303058.html