The C++ pointer parameter, In Java, became a reference parameter. Of course, C++ also supports reference parameters. As mentioned, most pointer parameters found in C++ code are simply holdovers from C. Nearly all new C++ code will use reference parameters when a function needs access to the argument, itself. (In essence, pointer parameters, although still common, are actually anachronisms in most C++ code.) Since both Java and C++ support reference parameters, you might think that the conversion of a C++ function that uses reference parameters to a Java method would involve few changes. Unfortunately, this is not always the case. To understand why, let's convert the following C++ program, which swaps the contents of two Coord objects using reference parameters:
// Swap coordinates - C++ version.
#include <iostream>
using namespace std;
class Coord
{
public:
int x;
int y;
};
// Swap contents of two Coord objects.
void swap(Coord &a, Coord &b)
{
Coord temp;
// swap contents of objects
temp = a;
a = b;
b = temp;
}
int main()
{
Coord ob1, ob2;
ob1.x = 10;
ob1.y = 20;
ob2.x = 88;
ob2.y = 99;
cout << "Original values:\\n";
cout << "ob1: " << ob1.x << ", " << ob1.y << "\\n";
cout << "ob2: " << ob2.x << ", " << ob2.y << "\\n";
cout << "\\n";
swap(ob1, ob2);
cout << "Swapped values:\\n";
cout << "ob1: " << ob1.x << ", " << ob1.y << "\\n";
cout << "ob2: " << ob2.x << ", " << ob2.y << "\\n";
return 0;
}
Following is the output produced by this program. As you can see, the contents of ob1 and ob2 have been exchanged:
Original values:
ob1: 10, 20
ob2: 88, 99
Swapped values:
ob1: 88, 99
ob2: 10, 20
In Java, all objects are accessed via an object reference variable. Thus, when an object is passed to a method, only its reference is passed. This means that all objects are automatically passed by reference to a Java method. Without thinking any deeper about what is actually occurring, someone might initially try the following (incorrect) conversion of the preceding program:
// Swap program incorrectly converted to Java.
class Coord {
int x;
int y;
};
class SwapDemo {
static void swap(Coord a, Coord b) {
Coord temp = new Coord();
// this won't swap contents of a and b!
temp = a;
a = b;
b = temp;
}
public static void main(String args[]) {
Coord ob1 = new Coord();
Coord ob2 = new Coord();
ob1.x = 10;
ob1.y = 20;
ob2.x = 88;
ob2.y = 99;
System.out.println("Original values:");
System.out.println("ob1: " +
ob1.x + ", " + ob1.y);
System.out.println("ob2: " +
ob2.x + ", " + ob2.y + "\\n");
swap(ob1, ob2);
System.out.println("Swapped values:");
System.out.println("ob1: " +
ob1.x + ", " + ob1.y);
System.out.println("ob2: " +
ob2.x + ", " + ob2.y + "\\n");
}
}
The output produced by this incorrect program is shown here:
Original values:
ob1: 10, 20
ob2: 88, 99
Swapped values:
ob1: 10, 20
ob2: 88, 99