102 votes

Déclaration de fonction à l'intérieur ou à l'extérieur de la classe

Je suis un développeur JAVA qui essaie d'apprendre le C++, mais je ne sais pas vraiment quelle est la meilleure pratique pour les déclarations de fonctions standard.

Dans la classe :

class Clazz
{
 public:
    void Fun1()
    {
        //do something
    }
}

Ou dehors :

class Clazz
{
public:
    void Fun1();
}

Clazz::Fun1(){
    // Do something
}

J'ai le sentiment que le second peut être moins lisible...

1 votes

Il y a en fait 3 options ici. Votre deuxième exemple pourrait avoir la définition de la fonction dans le fichier d'en-tête (mais toujours pas inlined), ou dans un fichier séparé de .cpp fichier.

0 votes

Cette question pourrait vous aider à comprendre.

3 votes

Juste une note : déclaration est toujours à l'intérieur de la classe, mais définition est soit intérieur, soit extérieur. Le titre et le corps de la question doivent être soumis à s/declaration/definition/ Vous ne me croyez pas ? stackoverflow.com/q/1410563/1143274

2voto

Marius Bancila Points 9184

La première doit être placée dans le fichier d'en-tête (où se trouve la déclaration de la classe). La seconde peut se trouver n'importe où, soit dans l'en-tête, soit, généralement, dans un fichier source. En pratique, vous pouvez placer de petites fonctions dans la déclaration de la classe (qui les déclare implicitement inline, bien que ce soit le compilateur qui décide en dernier ressort si elles seront inline ou non). Cependant, la plupart des fonctions ont une déclaration dans l'en-tête et l'implémentation dans un fichier cpp, comme dans votre deuxième exemple. Et non, je ne vois aucune raison pour laquelle cela serait moins lisible. Sans compter que vous pourriez en fait répartir l'implémentation d'un type sur plusieurs fichiers cpp.

1voto

R Mehta Points 11

Une fonction qui est définie à l'intérieur d'une classe est traitée par défaut comme une fonction en ligne. Une raison simple pour laquelle vous devriez définir votre fonction à l'extérieur :

Le constructeur de la classe vérifie la présence de fonctions virtuelles et initialise un pointeur virtuel pour qu'il pointe sur le VTABLE approprié ou sur l'objet table des méthodes virtuelles Il appelle le constructeur de la classe de base et initialise les variables de la classe actuelle, ce qui lui permet d'effectuer un travail.

Les fonctions en ligne sont utilisées lorsque les fonctions ne sont pas si compliquées et évitent la surcharge de l'appel de fonction. (L'overhead comprend un saut et un branchement au niveau matériel). Et comme décrit ci-dessus, le constructeur n'est pas aussi simple pour être considéré comme inline.

0voto

Les fonctions en ligne (fonctions déclarées dans la classe) sont collées dans votre code principal à chaque fois que vous les appelez. Alors que lorsque vous déclarez la fonction en dehors de la classe, lorsque vous appelez la fonction, elle provient de la même mémoire. C'est pourquoi c'est beaucoup mieux.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X