A C++ objektumok az alábbi módon jöhetnek létre:
- globális, névtérbeli változó vagy statikus adattag
C - program eleje
D - program vége
- automatikus objektum (névvel rendelkezik)
C - deklaráció kiértékelődik
D - vezérlés elhagyja a deklaráló blokkot
- dinamikus objektum (szabad memória, free store)
C - new
D - delete
- nemstatikus adattag
C - tartalmazó objektum létrejön
D - tartalmazó objektum megsemmisül
- tömbelem
C - tömb létrejön
D - tömb megsemmisül
- lokális statikus objektum
C - deklaráció első alkalommal kiértékelődik
D - program vége
- temporális objektum
C - (rész)kifejezés kiértékelése
D - teljes kifejezés kiértékelése után
- union tag
nem lehet statikus adattag
nem lehet konstruktora ill. destruktora
// automatikus élettartam
void f()
{
int i = 2; // initializáció: i
....
} // megsemmisül: i
// statikus élettartam
date d(2003,3,13); // inicializáció: d
static int i; // inicializáció: i
int main()
{
while ( ... )
{
if ( ... )
{
static int j = 6; // inicializáció: j
}
}
} // megsemmisülés: j, i, d
// dinamikus élettartam:
date *p = new date;
date *q = new date(*p);
date *s = new date[10];
//...
delete p;
delete p; // !! runtime error
delete s; // !! runtime error
delete [] s;// ez a helyes
// C-ben:
date *p = (date*) malloc(sizeof(date));
//...
free(p);
// Temporális objektumok
- Egy részkifejezés kiértékelésekor keletkezik
- A teljes kifejezés kiértékelése után semmisül meg
void f( string &s1, string &s2, string &s3)
{
const char *cs = (s1+s2).c_str();
cout << cs; // Bad!!
if ( strlen(cs = (s2+s3).c_str()) < 8 && cs[0] == 'a' ) // Ok
cout << cs; // Bad!!
}
// the correct way:
void f( string &s1, string &s2, string &s3)
{
cout << s1 + s2;
string s = s2 + s3;
if ( s.length() < 8 && s[0] == 'a' )
cout << s;
}
// another correct way:
void f( string &s1, string &s2, string &s3)
{
cout << s1 + s2;
const string &s = s2 + s3;
if ( s.length() < 8 && s[0] == 'a' )
cout << s; // Ok
} // s1+s2 destroyes here: when the const ref goes out of scope