6. 交换函数

题目:

解释为什么下面程序的交换函数没有把形参 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