Inhalt:
Hinweis auf Attribute im allgemeinen Sprachgebrauch: ``hat'', z.B. ein Fahrzeug hat eine Farbe.
Hinweis auf Vererbung im allgemeinen Sprachgebrauch: ``ist ein'', z.B. ein Auto ist ein Fahrzeug.
#include <iostream>
using namespace std;
int main(void)
{
cout << "Hello world!" << endl;
return 0;
}
Compilieren:
% c++ hello.cc -o hello % ./hello
#include <stdio.h>
#include <iostream>
using namespace std; // fuer cout etc.
class Fahrzeug {
public:
/* Attribute */
char *farbe; // jedes Fahrzeug hat eine Farbe
/* Methoden */
Fahrzeug(char *f){ farbe = f; }
void print(){ printf("Fahrzeug farbe=%s\n", farbe); }
friend ostream& operator<<(ostream &os, Fahrzeug &f){
os << f.farbe; return os; }
};
int main(void)
{
Fahrzeug f("weiss");
f.print();
cout << f << endl;
return 0;
}
typedef int DATA;
struct bknoten {
DATA d;
struct bknoten *l;
struct bknoten *r;
};
struct baum {
struct bknoten *wurzel;
};
struct baum *newBaum(void); void printBaum(struct baum *b); void printBaum1(struct bknoten *w); void insertBaum(struct baum *b, DATA d); void insertBaum1(struct bknoten **w, DATA *datap);
int main(int argc, char *argv[])
{
int i;
struct baum *t;
t = newBaum();
while(!feof(stdin)) {
if (fscanf(stdin, "%d", &i) > 0) {
insertBaum(t, i);
}
}
printBaum(t);
return 0;
}
typedef int DATA;
class bknoten {
public:
/* Oeffentliche Attribute */
DATA d;
class bknoten *l;
class bknoten *r;
/* Oeffentliche Methoden */
bknoten(DATA d2);
void print(void);
};
class baum {
/* Private Attribute */
class bknoten *wurzel;
/* Private Methoden */
void print1(class bknoten *k);
void insert1(class bknoten **k, DATA *datap);
public:
/* Oeffentliche Methoden */
baum(void);
void print(void);
void insert(DATA data);
};
/* Konstruktor bknoten Klasse */
bknoten::bknoten(DATA *d2)
{
d = *d2;
l = NULL;
r = NULL;
}
/* Konstruktor baum Klasse */
baum::baum(void)
{
wurzel = NULL;
}
/* Destruktor baum Klasse */
baum::~baum(void)
{
printf("Baum freigeben... (Not Implemented Here)\n");
}
int main(int argc, char *argv[])
{
int i;
class baum *t;
t = new baum(); /* malloc() + Konstruktor */
while(!feof(stdin)) {
if (fscanf(stdin, "%d", &i) > 0) {
t->insert(i);
}
}
t->print();
delete t; /* Destruktor + free() */
return 0;
}
class baum {
...
void print1(class bknoten *k);
...
void print(void);
...
};
void baum::print(void){ ... }
void baum::print1(class bknoten *w){ ... }
class baum {
...
void print1(class bknoten *k);
...
void print(void) {
assert(wurzel != NULL);
print1(wurzel);
}
...
};
void baum::print1(class bknoten *w){ ... }
class bknoten {
private:
DATA d;
public:
class bknoten *l;
class bknoten *r;
bknoten(DATA d2);
void print(void);
set(DATA d2) { d = d2; };
DATA get(void){ return d; }
friend void baum::insert1(class bknoten **w, DATA *datap);
};
void baum::insert1(class bknoten **w, DATA *datap)
{ ...
} else {
if (*datap < (*w)->get()) {
...
}
class Auto : public Fahrzeug {
public:
int raeder; // Anzahl
Auto(char *f, int r) : Fahrzeug(f) { raeder = r; };
void print(){
printf("Auto raeder=%d, farbe=%s; ", raeder, farbe);
Fahrzeug::print();
}
};
int main(void)
{
Fahrzeug f("schwarz");
f.print();
Auto a("rot", 4);
a.print();
return 0;
}
Fahrzeug farbe=schwarz Auto raeder=4, farbe=rot; Fahrzeug farbe=rot
class Complex {
public:
int r, i;
Complex(int r2, int i2){ r=r2; i=i2; }
void print(void){ printf("(%d+%di)", r, i); }
Complex operator+(Complex op) {
return Complex(r + op.r, i + op.i);
}
};
int main(void)
{
Complex a(1,0), b(0,1), c(0,0);
printf("a="); a.print(); printf(", ");
printf("b="); b.print(); printf("\n");
c = a + b;
printf("c="); c.print(); printf("\n");
return 0;
}
a=(1+0i), b=(0+1i) c=(1+1i)
| Overloadable operators |
|---|
+ - * / = < > += -= *= /= << >> <<= >>= == != <= >= ++ -- % & ^ ! | ~ &= ^= |= && || %= [] () , ->* -> new delete new[] delete[] |
| Expression | Operator | Member function | Global function |
|---|---|---|---|
| @a | + - * & ! ~ ++ -- | A::operator@() | operator@(A) |
| a@ | ++ -- | A::operator@(int) | operator@(A,int) |
| a@b | + - * / % ^ & | < > == != <= >= << >> && || , | A::operator@ (B) | operator@(A,B) |
| a@b | = += -= *= /= %= ^= &= |= <<= >>= [] | A::operator@ (B) | - |
| a(b, c...) | () | A::operator() (B, C...) | - |
| a->x | -> | A::operator->() | - |
(Quelle)
int max(int a, int b) { return (a>b)?a:b; }
double max(double a, double b){ return (a>b)?a:b; }
int main(void)
{
printf("1) max = %d\n", max(2,1));
printf("2) max = %f\n", max(0.2,-1.0));
return 0;
}
Ausgabe:
1) max = 2 2) max = 0.200000
class Auto : Fahrzeug {
...
Auto(char *f="rot", int r=4)
: Fahrzeug(f) { raeder = r; };
...
main()
{
...
Auto rotes_auto; rotes_auto.print();
Auto blaues_auto("blau"); blaues_auto.print();
Auto blaues_zweirad("blau", 2); blaues_zweirad.print();
Ausgabe:
Auto raeder=4, farbe=rot; Fahrzeug farbe=rot Auto raeder=4, farbe=blau; Fahrzeug farbe=blau Auto raeder=2, farbe=blau; Fahrzeug farbe=blau
void swap_C(int *a, int *b) {
int c = *b; *b = *a; *a = c;
}
void swap_CPlusPlus(int &a, int &b)
{
int c = b; b = a; a = c; // keine *
}
int main(void)
{
int a=1, b=2;
printf("a=%d, b=%d\n", a, b);
swap_C(&a, &b);
printf("a=%d, b=%d\n", a, b);
swap_CPlusPlus(a, b); // keine &
printf("a=%d, b=%d\n", a, b);
return 0;
}
#include <iostream> // kein .h
using namespace std; // gcc 3.x und spaeter, siehe unten
class Complex {
public:
int r, i;
Complex(int r2, int i2){ r=r2; i=i2; }
friend ostream& operator <<(ostream &os, Complex &obj)
{
os << "(" << obj.r << "+" << obj.i << "i)";
return os;
}
};
int main(void)
{
int a=2, b=3;
Complex z(3,4);
cout << a << " + " << b << " = " << a+b << endl;
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "z = " << z << endl;
return 0;
}
Ausgabe:
2 + 3 = 5 a = 2 b = 3 z = (3+4i)
void func()
{
try
{
throw 1;
}
catch(int a)
{
cout << "Caught exception number: " << a << endl;
return;
}
cout << "No exception detected!" << endl;
return;
}
aus: "C++ Exception Handling" von Denton Woods, Stand 10.1.2007
Problem:
... Diverse Sachen ...
class String {
...
};
... Diverse Sachen ...
class String {
...
};
#include "hersteller1.h" #include "hersteller2.h" String s;
... Diverse Sachen ...
namespace Hersteller1 {
class String {
...
};
}
... Diverse Sachen ...
namespace Hersteller2 {
class String {
...
};
}
#include "hersteller1.h" #include "hersteller2.h" using namespace Hersteller1; String s1; Hersteller2::String s2;
Beispiel: Baumklasse fuer beliebige Objekte
// kein typedef fuer DATA mehr!!!
template <typename DATA>
class bknoten {
public:
DATA d;
class bknoten *l;
class bknoten *r;
bknoten<DATA>(DATA d2);
void print(void);
};
template<typename DATA>
class baum {
class bknoten<DATA> *wurzel;
void print1(class bknoten<DATA> *k);
void insert1(class bknoten<DATA> **k, DATA *datap);
public:
baum<DATA>(void);
~baum<DATA>(void);
void print(void);
void insert(DATA data);
};
/* Konstruktor baum Klasse */
template <typename DATA>
baum<DATA>::baum(void)
{
wurzel = NULL;
}
...
/* Konstruktor bknoten Klasse */
template <typename DATA>
bknoten<DATA>::bknoten(DATA d2)
{
d = d2;
l = NULL;
r = NULL;
}
...
template <typename DATA>
void baum<DATA>::insert1(class bknoten<DATA> **w, DATA *datap)
{
assert(w != NULL);
if (*w == NULL) {
*w = new bknoten<DATA>(*datap);
} else {
...
int main(int argc, char *argv[])
{
class baum<char> *t1;
t1 = new baum<char>();
t1->insert('c'); t1->insert('d'); t1->insert('a');
t1->insert('b'); t1->insert('e');
t1->print();
delete t1;
class baum<int> *t2;
t2 = new baum<int>();
t2->insert(333); t2->insert(444); t2->insert(111);
t2->insert(222); t2->insert(555);
t2->print();
delete t2;
return 0;
}
97 = a 98 = b 99 = c 100 = d 101 = e Baum freigeben... (Not Implemented Here) 111 = o 222 = ? 333 = M 444 = ? 555 = + Baum freigeben... (Not Implemented Here)
Inhalt: Klassen und Templates für ...
Verweise: