CS253: Software Development with C++

Spring 2018


See this page as a slide show

CS253 Traps

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.

Methods & Functions

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().


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.

Poor George Boole

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.


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.


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.


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.


In Java, classes start with a capital letter. That’s not always so in C++.

Objects: heap or not?

In Java, objects are always in the heap—dynamic memory. In C++, they can be, but don’t have to be.

String Subscripting

Sure, C++’s string class has an .at() method, but, why?

Order of Operations

int n=0;
System.out.println(++n + ++n);
int n=0;
cout << ++n + ++n << '\n';
c.cc:2:9: warning: operation on 'n' may be undefined

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.

Plus-sign overloading

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".

Pointers and references

Java has only references, which are like pointers with automatic indirection.

C++ has both explicit pointers, and references.

Method/Member Access

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.

Garbage Collection

In C++, your options are (hardest to easiest):


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.

Out of Bounds

int[] a = {11,22,33};
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -12
	at Code.main(Code.java:2)

Java throws an exception.

C++ assumes that you know what you’re doing.


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.

The Biggest Difference

User: Guest

Edit History Source

Modified: 2018-05-13T22:29

Apply to CSU | Contact CSU | Disclaimer | Equal Opportunity
Colorado State University, Fort Collins, CO 80523 USA
© 2018 Colorado State University
CS Building