CS253: C++ traps for the unwary Java programmer
This is not a list of all Java/C++ differences. Instead, it is a list of differences that are likely to cause problems for a programmer who knows Java but is learning C++.
If you ask, “Why doesn’t C++ do such-and-such a thing like Java?”, then you’re asking the wrong question.
In Java, everything’s a method, because everything’s in a class.
C++ has methods inside of classes. However, C++ also has
functions outside of classes, like main()
.
public static void main(String[] args)
int main()
int main(int argc, char *argv[])
In C++, main
returns an int indicating success/failure.
Zero indicates success, positive numbers indicate failure.
It’s not a boolean success indicator. It’s an integer code.
In C++, main
uses an array of old-style C char *
strings,
for compatibility with C.
boolean b = true; if (b) System.out.println("It is true in Java.");
It is true in Java.
bool b = true; if (b) cout << "It is true in C++.\n";
It is true in C++.
Neither is “boole”, which was the guy’s name.
char
, byte
char
byte
(C++17)
C++’s char
type is the closest approximation to Java’s byte
.
Java’s char
can hold Unicode characters.
C++’s char
has an implementation-defined size, but it’s typically
a single byte.
final
final
, const
, constexpr
In Java, final
indicates a non-overrideable method,
or a constant value.
In C++, final
indicates a non-overridable method.
const
indicates a method that doesn’t alter object state,
or a value that you can’t change.
constexpr
indicates a compile-time constant.
int[] a = new int[100];
int a[100];
In C++, arrays are not objects. Hence, they have no methods.
Hence, you can’t ask an array how long it is. Use a vector
or std::array
instead, if you want that.
The simple term “array” is, alas, ambiguous. We will use the
phrases “C-style array” or std::array
to resolve this.
String
string
In Java, classes start with a capital letter. That’s not always so in C++.
String s = new String;
string s;
In Java, objects are always in the heap—dynamic memory. In C++, they can be, but don’t have to be.
char c = s.charAt(3);
char c = s[3];
Sure, C++’s string
class has an .at()
method, but, why?
int n=0; System.out.println(++n + ++n);
3
int n=0; cout << ++n + ++n << '\n';
c.cc:2: warning: operation on 'n' may be undefined 4
The Java example yields 3
, because the order of operations
is defined by the language.
The C++ example invokes undefined behavior. The compiler is free
to do those operations (++
, ++
, +
) in whatever order
it considers to be best.
System.out.println("foobar"+3);
foobar3
cout << "foobar"+3 << '\n';
bar
In Java, +
is overloaded to handle arguments of String
and int
,
and so yields "foobar3"
.
C++ performs address arithmetic in this case, and so yields "bar"
.
Java has only references, which are like pointers with automatic indirection.
C++ has both explicit pointers, and references.
alpha.beta()
alpha.beta()
or alpha->beta()
In Java, alpha
can only be a reference.
In C++, alpha
might be an object, a reference to an object,
or a pointer to an object.
delete
and delete[]
In C++, your options are (hardest to easiest):
new
/ new[]
,
deallocate with delete
/ delete[]
.
vector
or set
which do the
memory allocation/deallocation for you.
obj1 = obj2;
obj1 = obj2;
In Java, this copies a reference. No new object is created, no real data is copied.
In C++, the copy ctor of the class is called. This typically copies the data in the object.
int[] a = {11,22,33}; System.out.println(a[-12]);
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -12 at Code.main(Code.java:2)
int a[] = {11,22,33}; cout << a[-12] << endl; cout << a[-12000000] << endl;
0 SIGSEGV: Segmentation fault
Java throws an exception.
C++ assumes that you know what you’re doing.
null
nullptr
or NULL
or 0
In Java, null
is the reference to nothing.
In C++, a pointer that points to nothing useful can be initialized
to nullptr
or NULL
or 0
.
nullptr
is best
NULL
is compatible with C
0
is just plain stupid