Maximilian Krieg
Wissen, Technik & Erfahrungen
Wissen, Technik & Erfahrungen
Wissen, Technik & Erfahrungen

class mitzaehl {
public:
mitzaehl(){++zahl;}
~mitzaehl(){--zahl;}
int anz(){return zahl;}
private:
static int zahl;
};
int mitzaehl::zahl = 0;
int main() {
mitzaehl a, b;
cout << a.anz() << ' ' << b.anz();
return 0;
}
// Zuweisung
int* pi = new int;
void* pro = pi
// Explizite Umwandlung geht
int* pi = static_cast<int*>(pv);
void f( int pi[] ) { // gleichbedeutend mit void f( int* pi )
int a[] = { 1,2,3,4 };
//int b[] = a;// FEHLER: Arrays kennen keine Kopieroperation
pi = a; // OK, ist aber keine Kopie: pi zeigt jetzt
// auf das erste Element von a
int* p = a; // p zeigt auf das erste Element von a
int* q = pi; // q zeigt auf das erste Element von a
}
// Am Ende ist die Adresse von pi verloren gegangen.
int a( 0 ); char ac[20];
void f( int n ) {
int b( 0 );
int* p = &b; // p zeigt auf die lokale Variable namens b
p = &a; // p zeigt auf die globale Variable namens a
char* pc = ac; // Array-Namen sind Zeiger auf ihr erstes Element
pc = &ac[0]; // gleichbedeutend mit pc = ac
pc = &ac[n]; // zeigt auf das n-te Element, es erfolgt
// keine Überprüfung der Zugriffsgrenzen
//..
}
int a = 10;
int* z = &a; // der Adressoperator & gibt uns einen Zeiger auf a
*z = 7; // Zuweisung an a durch z
// Der Dereferenzierungsoperator * (oder []) gibt
// uns Zugriff auf das, worauf der Zeiger verweist
int x1 = *z; // lesender Zugriff auf a durch z
int& r = a; // r ist ein Synonym für a
r = 9; // Zuweisung an a durch r
int x2 = r; // lesender Zugriff auf a durch r
z = &x1; // ein Zeiger kann seinen Wert (eine Speicheradresse)
// ändern, d.h. auf ein anderes Objekt verweisen
r = &x1; // FEHLER: eine Referenz kann ihren Wert nicht ändern
class myVector {
int sz; // size
int space; // size + weiterer Platz
double* elem; // Zeiger auf die Elemente
public:
myVector( ); // Standardkonstruktor
explicit myVector( int ); // ein Konstruktor
myVector( const myVector& ); // Copy-Konstruktor
myVector& operator=( const myVector& ); // Zuweisungsoperator
~myVector( ); // Destruktor
double& operator[]( int ); // Indexoperator
int size( ) const; // Anzahl Elemente
double get( int ) const; // read
void set( int, double ); // write
void reserve( int );
void resize( int );
void push_back( double );
int capacity( ) const { return space; }
};
void myVector::reserve( int newspace ) {
if( newspace <= space ) return; // nie weniger Platz holen
double* p = new double[newspace]; // mit new Speicher allokieren
for( int i=0; i<sz; ++i ) p[i]=elem[i]; // Elemente kopieren
delete[] elem; // alten Speicher freigeben
elem = p;
space = newspace;
}
void myVector::resize( int newsize ) {
reserve( newsize ); // Speicher im Heap reservieren
for( int i = sz; i<newsize; ++i ) // Initialisierung der
elem[i] = double(); // zusätzlichen Elemente
sz = newsize;
}
void myVector::push_back( double d ) {
if( space==0 ) reserve( 8 ); // Platz aus dem Heap holen…
else
if( sz==space )
reserve( space*2 ); // Kein Platz mehr? Aus dem Heap holen…
elem[sz] = d; // d anhängen
++sz; // und den Elementezähler erhöhen
}