Was passiert da?

Hallo

Kann mir jemand sagen was in folgendem Programmbeispiel genau passiert? Wieso kann test T() kompiliert werden und was ist das jetzt? Der Konstruktor wird offensichtlich nicht aufgerufen. Hmmm, verwirrend.

Gruss, Olli

// main.C
// gcc version 3.2.3 20030502 (Red Hat Linux 3.2.3-20)
#include 
#include 

class test
{
 public:
 test() { printf( "Test constructor\n" ); }
 ~test(){ printf( "Test destructor\n" ); }
};

// Main I
int main( int argc, char\* argv[] )
{
 test T();
 return 0;
}
$ g++ -Wall main.C
$ ./a.out
$

// Main II
int main( int argc, char\* argv[] )
{
 test T;
 return 0;
}
$ g++ -Wall main.C
$ ./a.out
 Test constructor
 Test destructor
$

Hallo Olli,

‚test T();‘ deklariert eine Funktion ‚T‘ mit dem Rückgabewert vom Typ ‚test‘.

Gruß Tobias

Ja, logisch (Klapps an die Stirn). Vielen Dank Tobias.

Gruss, Olli

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Tobias!

‚test T();‘ deklariert eine Funktion ‚T‘ mit dem Rückgabewert
vom Typ ‚test‘.

Hätt’ ich auch mal so geraten, aber: darf man denn das? Ich dachte lokale Funktionsdeklarationen wären nicht erlaubt?

Gruß
Martin

äh… NEIN!

test T(); deklariert KEINE Funktion (das kann man soweit ich weiß auch nicht innerhalb einer anderen Funktion), sondern einfach ein Element der Klasse test;
Beispiel:

#include
using namespace std;

class Klassenklown
{
Klassenklown(); // [Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo ff!

test T(); deklariert KEINE Funktion (das kann man soweit ich
weiß auch nicht innerhalb einer anderen Funktion), sondern
einfach ein Element der Klasse test;

Und wie erklärst du die Ausgabe im ersten Programmbeispiel des OP?

Gruß
Martin

äh… NEIN!

Sorry, aber da liegst du falsch es wird definitiv keine Variable vom Typ ‚test‘ deklariert, sondern wie gesagt eine Funktion.

Lokale Funktionsdeklarationen sind erlaubt, nur lokale Funktionsdefinitionen nicht.

Gruß Tobias

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Morgen

Ich habe da noch ein paar Tests geschrieben. Vermutlich ist es tatsächlich eine Funktionsdeklaration, bin mir aber nicht ganz sicher.

Gruss, Olli

// main.C
// gcc version 3.2.3 20030502 (Red Hat Linux 3.2.3-20)
#include 
#include 

class test
{
 public:
 test():mTest(99){ printf( "Test constructor\n" ); }
 ~test(){ printf( "Test destructor\n" ); }

 int getTest(){ return mTest; }
 void setTest( int New ){ mTest = New; }

 private:
 int mTest;
};

// TEST I
int main( int argc, char\* argv[] )
{
 test T;
 printf( "T.getTest() = %i\n", T.getTest() );
 return 0;
}
$ g++ main.C
$ ./a.out
Test constructor
T.getTest() = 99
Test destructor

// TEST II
int main( int argc, char\* argv[] )
{
 test T();
 printf( "T.getTest() = %i\n", T.getTest() );
 return 0;
}
$ g++ main.C
main.C: In function `int main(int, char\*\*)':
main.C:20: request for member `getTest' in `T()', which is of non-aggregate
 type `test ()()'


// TEST III
test T()
{
 static test \_T ;
 \_T.setTest( -1 );
 return \_T;
}

int main( int argc, char\* argv[] )
{
 test \_T = T();
 printf( "\_T.getTest() = %i\n", \_T.getTest() );
 return 0;
}
$ g++ main.C
$ ./a.out
Test constructor
\_T.getTest() = -1
Test destructor
Test destructor

// TEST IV
int main( int argc, char\* argv[] )
{
 test T()
 {
 static test \_T;
 \_T.setTest( -1 );
 return \_T;
 }
// test \_T = T();
// printf( "\_T.getTest() = %i\n", \_T.getTest() );
 return 0;
}
$ g++ main.C
main.C: In function `int main(int, char\*\*)':
main.C:71: syntax error before `{' token
main.C:73: `\_T' undeclared (first use this function)
main.C:73: (Each undeclared identifier is reported only once for each function
 it appears in.)
main.C: At global scope:
main.C:79: syntax error before `return'

Ach soooooooooooo …
Es ist tatsächlich eine Funktionsdeklaration (siehe unten).

Danke für das Interesse und für die Hilfe.
Gruss, Olli

// main.C
// gcc version 3.2.3 20030502 (Red Hat Linux 3.2.3-20)
#include 
#include 

class test
{
 public:
 test():mTest(99){ printf( "Test constructor\n" ); }
 ~test(){ printf( "Test destructor\n" ); }

 int getTest(){ return mTest; }
 void setTest( int New ){ mTest = New; }

 private:
 int mTest;
};

int main( int argc, char\* argv[] )
{
 test T();
 printf( "T().getTest() = %i\n", T().getTest() );
 return 0;
}

test T()
{
 static test \_T ;
 \_T.setTest( -1 );
 return \_T;
}
$ g++ main.C
$ ./a.out
Test constructor
T().getTest() = -1
Test destructor
Test destructor