Gå til innhold

Funksjoner og klasser her og der


Anbefalte innlegg

Inspirert av en annentråd så begynte jeg å fundere på noen småting.

 

Jeg har alltid hatt følgende praksis når jeg lager (jeg skriver konsekvent 'lager' i denne posten, for å ikke blande deklarering og definering osv) funksjoner og klasser:

 

#include <iostream>
void f(){ std::cout << "A function\n"; }

class T{
public:
T(){ std::cout << "Default constructor\n";}
};

int main (){
T t1;
f();
return 0;
}

 

Altså semikolon etter en klasse, og ikke etter funksjoner. Men følgende er også god fisk:

 

#include <iostream>

void f(){ std::cout << "A function\n"; };


int main (){
class T{

public:
T(){ std::cout << "Default constructor\n";};
};

T t;
f();
return 0;
};

 

Altså ; etter alle funksjoner og klasser. Hva er forskjellen? Hvorfor må en klasse avsluttes med et ; mens det er valgfritt etter funksjoner?

 

Men mer moro kommer, en klasse kan også lages inne i en funksjon:

 

#include <iostream>

void f(){ std::cout << "weird function\n"; };


int main (){

class T{
public:
 T(){ std::cout << "Default constructor\n";};
};

T t;
f();
return 0;
};

 

Men prøver man å flytte en funksjon inn i en annen, da får man problemer.

 

Er det noen grunn til at det er slik, eller er det bare slik det er?

Lenke til kommentar
Videoannonse
Annonse

Jeg vet ikke bakgrunnen for at C++ krever semikolon etter en klassedefinisjon, men det er sikkert en god grunn siden de gjorde det slik i standarden.

 

Når det gjelder semikolon etter en funksjon vil vel parseren tolke det som "end of statement" og dermed ignorere den siden det faktisk ikke er noe statement før semikolonet. Nå sitter ikke jeg med kompilator, men følgende vil sikkert også kompilere:

 

class foo
{
public:

;;;;;;;;;int _var;;;;;;;;;;;
 
};

 

 

En klasse i en klasse kalles nested class, mens en klasse i en funksjon kalles en local class.

 

Det er nok flere grunner til at C++ (og C) ikke tillater nestede eller lokale funksjoner som mange kaller dem. Hovedgrunnen er nok ytelse siden det vil komplisere stacken. Og gevinsten med å tillate det er veldig liten siden vi kan gjøre det samme mer elegant med andre metoder.

 

Jeg mener å huske at Herb Sutter har skrevet litt om akkurat dette i en av Exceptional C++ bøkene sine hvis du har tilgang til de.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...