| [506d4f0] | 1 | #include <fstream.hfa> | 
|---|
|  | 2 | #include <stdlib.hfa> | 
|---|
|  | 3 |  | 
|---|
|  | 4 | int main() { | 
|---|
| [097e2b0] | 5 | // initialize basic structure | 
|---|
|  | 6 | struct S { | 
|---|
|  | 7 | int i, j, k; | 
|---|
|  | 8 | }; | 
|---|
| [506d4f0] | 9 | void ?{}( S & s ) { s.i = 1, s.k = 2; }             // default constructor | 
|---|
|  | 10 | void ?{}( S & s, int i, int k ) { s.i = i, s.k = k; } // 2 parameter constructor | 
|---|
|  | 11 | void ?{}( S & s, S c ) { /* s @= c */ s.[i,j,k] = c.[i,j,k]; } // copy constructor | 
|---|
|  | 12 | void ^?{}( S & s ) { s.i = 0, s.k = 0; }            // default destructor | 
|---|
|  | 13 | void ^?{}( S & s, int i ) { s.i = i, s.k = i; }     // 1 parameter destructor | 
|---|
| [097e2b0] | 14 | { | 
|---|
| [506d4f0] | 15 | S s1;                                           // default constructor | 
|---|
|  | 16 | S s2 = { 3, 7 };                                // 2 parameter constructor | 
|---|
|  | 17 | S s3 @= { .k:3, .i:7 };                         // 2 parameter C initialization | 
|---|
|  | 18 | ?{}( s3, 2, 5 );                                // explicit 2 parameter constructor | 
|---|
|  | 19 | ^?{}( s1 );                                     // explicit call to default destructor | 
|---|
| [097e2b0] | 20 | } // implicit call to default destructor for s2, explicit call s1, no call for s3 | 
|---|
| [506d4f0] | 21 | S s4 @= {};                                         // no default construction | 
|---|
|  | 22 | (s4){ 2, 5 };                                       // explicit 2 parameter constructor | 
|---|
|  | 23 | ^s4{ 3 };                                           // explicit call to 1 parameter destructor | 
|---|
| [097e2b0] | 24 |  | 
|---|
|  | 25 | // initialize pointer to a basic structure | 
|---|
|  | 26 |  | 
|---|
| [506d4f0] | 27 | void ?{}( S *& s ) { s = malloc(); s->i = 1, (*s).k = 2; } // default constructor | 
|---|
|  | 28 | void ?{}( S *& s, int i, int k ) { s = malloc(); (*s).i = i, (*s).k = k; } // 2 parameter constructor | 
|---|
|  | 29 | void ^?{}( S *& s ) { (*s).i = 0, (*s).k = 0; free( s ); &s = 0p; } // default destructor | 
|---|
| [097e2b0] | 30 | { | 
|---|
| [506d4f0] | 31 | S * ps1;                                        // default constructor | 
|---|
|  | 32 | S * ps2 = { 3, 7 };                             // 2 parameter constructor | 
|---|
|  | 33 | sout | ps1 | ps2; | 
|---|
|  | 34 |  | 
|---|
|  | 35 | S * ps3 @= 0p;                                  // C initialization | 
|---|
|  | 36 | S * ps4 @= { 3 };                               // no default construction | 
|---|
|  | 37 | sout | ps3 | ps4; | 
|---|
| [097e2b0] | 38 |  | 
|---|
| [506d4f0] | 39 | ?{}( ps3, 2, 5 );                               // explicit 2 parameter constructor | 
|---|
|  | 40 | (ps4){ 2, 5 };                                  // explicit 2 parameter constructor | 
|---|
|  | 41 | sout | ps3 | ps4; | 
|---|
|  | 42 |  | 
|---|
|  | 43 | ^?{}( ps3 );                                    // explicit call to default destructor | 
|---|
|  | 44 | ^ps4{};                                         // explicit call to default destructor | 
|---|
|  | 45 | sout | ps3 | ps4; | 
|---|
|  | 46 | } // implicit call to default destructor for ps2 and ps1, checks ordering of explicit destructor calls | 
|---|
| [097e2b0] | 47 |  | 
|---|
|  | 48 | // initialize complex structure | 
|---|
|  | 49 |  | 
|---|
|  | 50 | struct T { | 
|---|
|  | 51 | struct S s; | 
|---|
|  | 52 | }; | 
|---|
|  | 53 |  | 
|---|
| [506d4f0] | 54 | void ?{}( T & t ) {}        // default constructor => implicitly call constructor for field s | 
|---|
|  | 55 | void ?{}( T & t, int i, int k ) { (t.s){ i, k }; } // 2 parameter constructor => explicitly call constructor for field s | 
|---|
|  | 56 | void ?{}( T & t, S c ) { (t.s){ c }; }// 1 parameter constructor => explicitly call copy constructor for field s | 
|---|
|  | 57 | void ^?{}( T & s ) {}       // destructor => implicitly call destructor for field s | 
|---|
|  | 58 | void ^?{}( T & s, int i ) {}// destructor => implicitly call destructor for field s | 
|---|
| [097e2b0] | 59 | { | 
|---|
| [506d4f0] | 60 | S s;                                            // default constructor | 
|---|
|  | 61 | T t1;                                           // default constructor | 
|---|
|  | 62 | T t2 = { s };                                   // 1 parameter constructor | 
|---|
|  | 63 | ^?{}( t1, 3 );                                  // explicit call to default destructor => implicit call to t1.s's destructor | 
|---|
|  | 64 | T t3;                                           // default constructor | 
|---|
|  | 65 | T t4 @= { { 1, 3 } };                           // C initialization | 
|---|
|  | 66 | (t4){ 2, 5 };                                   // explicit 2 parameter constructor | 
|---|
| [097e2b0] | 67 | } // implicit call to default destructor for t2 and implicit call for s; | 
|---|
|  | 68 |  | 
|---|
|  | 69 | T *pt = malloc(){ 3, 4 };   // common usage | 
|---|
|  | 70 | } // implicit call to default destructor for t3 | 
|---|