C++ vs. Java Hello world! • Java class HelloWorld { static public void main(String args) { System.out.println("Hello World!"); } } • C #include <stdio.h> main() { printf("Hello World!\n"); } • C++ #include <iostream> using namespace std; int main() { cout << "Hello World!" << endl; } © 2007 AG Rechnernetze 1-overview.1 C++ vs. Java Grundlegendes C++ Java Compiler/Inter preter C++-Programme werden nach Übersetzung nach Bytecode; Maschinencode übersetzt Inter pretation durch Virtual Machine Standardisierung ISO-Standard; ISO-Standardisierung abgebrochen verabschiedet Juli 1998 C C ist Teilmenge von C++ Präprozessor #define → Makros #ifdef → bedingte Übersetzung (nicht vorhanden) #include → Expor t/Impor t-Relation zwischen Modulen © 2007 AG Rechnernetze 1-overview.2 C++ vs. Java Datentypen Grunddatentypen bool, char, int, short int, long int, float, boolean, char, byte, shor t, int, long, double, long double float, double Vorzeichenlos, vorzeichenbehaftet unsigned char, signed char, unsigned int, unsigned short int, unsigned long int Typ-Größen Implementierungsspezifisch Durch Sprache fest vorgegeben (in festen Grenzen) Zeichentyp char = 8 Bit (ISO-8895-1); wchar_t char = 16 Bit (Unicode) Bool-Typ bool kompatibel mit int-Typen boolean Enumerationstypen enum color {red, blue, green}; © 2007 AG Rechnernetze 1-overview.3 C++ vs. Java Pointer und References Pointer int *p, i; p = &i; *p = 3; C++-Pointer vs. Java-References Explizite Pointer: Implizite Referenzen für Arrays und Objekte: Car *mycar; Car mycar ; mycar = new Car("Saab 900"); mycar = new Car("Saab 900"); Zuweisen by reference Vector *a, *b; //... Vector a, b; //... a = b; a = b; Zuweisen by value Vector *a, *b, c, d; //... Vector a, b; //... *a = *b; c = d; a = b.clone(); Pointer-Arithmetik p++; p −= i; p−q; Referenz-Typ int i, &r = i; r = 3; © 2007 AG Rechnernetze 1-overview.4 C++ vs. Java Pointer und References, Variablen, Arrays Objektzugriff über Pointer Coordinate c; (Zugriff immer by reference: c−>x = 0; c−>y = −1; c.x = 0; c.y = 0;) Speicher verwaltung Explizite Freigabe von Objekten Automatische Freigabe durch durch delete-Operator Garbage Collection Uninitialisier te Variablen Erlaubt (außer const, reference) Nicht erlaubt bzw. automatische Initialisierung Globale Variablen Ja Nein (Variablen nur in Klassen) Array-Typ Arrays; Arrays enge Relation mit Pointern Bounds-Checking Nein Ja © 2007 AG Rechnernetze 1-overview.5 C++ vs. Java Funktionen, Argument-Übergabe Funktionen außerhalb von Klassen erlaubt: z. B. main() Funktionen Nur Methoden Argument-Übergabe by-value by-value (primitive Typen und Objekt-Referenzen) Argument-Übergabe by-reference Über Pointer oder Referenzen: void swap(int *a, int *b); Nicht direkt möglich void swap(int &b, int &b); Default-Argumente void print(int n, int base = 10); Unspezifizier te Argumentanzahl int execl(char* ...); Inline-Funktionen inline int max(int a, int b); (Automatisch) © 2007 AG Rechnernetze 1-overview.6 C++ vs. Java Ausdrücke, Statements Null-Pointer/Referenz Integer-Wer t 0 oder „NULL-Symbol“ null-Schlüsselwor t Strings Null-terminierte char-Arrays Klassen String, Stringbuffer Standardlibrary: String-Klasse Überladene Operatoren Ja Nein (nur Methoden) Boolean Expressions in Statements bool kompatibel mit Ganzzahl/Pointer : Ausdruck muß boolean liefern: int i = 5; int i = 5; while (i−−) {... while (i−− != 0) {... goto, break, continue goto label; (kein goto) break; break [label]; continue; continue [label]; © 2007 AG Rechnernetze 1-overview.7 C++ vs. Java Datenabstraktion typedef typedef int offset_t; Weitere Typ-Konstrukte struct, bitfields, union Funktionen als Objekte Funktions-Pointer (Nur über Klassen möglich) Zugriff auf Instanz-Variablen private/protected/public private/protected/public (auch bei Inheritance angeben) Default: Zugriff für Package friend-Funktionen, friend-Klassen Generizität/Typ-Parameter Template-Klassen Template-Funktionen © 2007 AG Rechnernetze 1-overview.8 C++ vs. Java Vererbung, Dynamisches Binden, Threads Vir tuelle Funktionen/Methoden vir tual-Keyword Per default (Ausschalten mit final) Vir tuelle Funktionen ohne Implementierung vir tual int f() = 0; abstract int f(); Objekt-Finalisierung Destruktoren finalize-Methode (aber expliziter Aufruf für Superklasse nötig) Multiple Inheritance class DrawableCircle: class DrawableCircle public Circle, extends Circle public Drawable { ... implements Drawable { ... Threads/Nebenläufigkeit Threads-Libraries In Sprache integrier t © 2007 AG Rechnernetze 1-overview.9