CS253: Software Development with C++

Spring 2019

Traps

Show Lecture.Traps 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++.

Age

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

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("true in Java");
true in Java
bool b = true;
if (b)
    cout << "true in C++\n";
true in C++

Neither is “Boole”, which was how the guy spelled his name.

Booleanosity

In Java, true is true. In C++, any non-zero value is true.

if (42)
    System.out.println("true in Java");
Code.java:1: error: incompatible types: int cannot be converted to boolean
class Code { public static void main(String[] args) { if (42)
                                                          ^
1 error
if (true && 42 && 3.14159 && 'x' && "hello")
    cout << "true in C++\n";
true in C++

Byte

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

Arrays

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.

Strings

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

"what type am I?"

Objects: heap or not?

String Subscripting

String s = "abcdefg";
System.out.println(s.charAt(3));
d
string s = "hijklmn";
cout << s[3] << '\n';
cout << s.at(4) << '\n';
k
l

Order of Operations

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. The compiler is not required to tell you if you broke the rules.

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

int[] reed = {1,2,3}, sue = reed;
// reed & sue share data
reed[0] = 4;
System.out.println(reed[0] + " " + sue[0]);
4 4
vector<int> ben = {1,2,3}, johnny = ben;
// johnny is a copy of ben
ben[0] = 4;
cout << ben[0] << ' ' << johnny[0] << '\n';
4 1

This C++ code uses no pointers or references.

Copying

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.

Method/Member Access

String s = "foobar";
System.out.println(s.length());
6
string a = "xyzzy";
string *b = new string("alakazam");
cout << a.length() << ' ' << b->length() << '\n';
cout << a.size()   << ' ' << b->size() << '\n';
5 8
5 8

Garbage Collection

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

Out of Bounds

int[] a = {11,22,33};
System.out.println(a[-12]);
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.

Nothingness

In Java, null is the reference to nothing.

In C++, a pointer to nothing useful can be initialized to nullptr or NULL or 0.

The Biggest Difference

  • C++: rules
  • Java: drools

Parting Shot

made at imgflip.com

User: Guest

Check: HTML CSS
Edit History Source

Modified: 2019-03-15T22:39

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