Bonjour,
Je suis débutant en C++. J'aimerais savoir pourquoi on met le mot clef "class" dans le code ci-dessous :
Un void readConf(INIFile* inifile); ne suffit - il pas ?Code:void readConf(class INIFile* inifile);
Merci d'avance pour votre aide
Version imprimable
Bonjour,
Je suis débutant en C++. J'aimerais savoir pourquoi on met le mot clef "class" dans le code ci-dessous :
Un void readConf(INIFile* inifile); ne suffit - il pas ?Code:void readConf(class INIFile* inifile);
Merci d'avance pour votre aide
Je pense que c'est une écriture indirectement héritées du C. En C lorrsque l'on instancie, que l'on passe comme argument ou que l'on retourne un structure, on doit écrire explicitement le mot clé struct devant (il y a moins de contourner mais ça sort du sujet) :
Le C++ autorise cette syntaxe, sans doute à cause de problèmes d'intercompatibilité; comme class et struct sont des mots clés quasi-équivalents(voir la FAQ), il doit autoriser ce comportement pour les classes également.Code:
1
2
3
4
5
6 struct MaStruct {}; // définition struct MaStruct uneInstanceDeMaStruct; // déclaration d'une variable de type MaStruct struct MaStruct fonctionRetour(); //declaration d'une fonction retournant une structure MaStruct void parametre(struct MaStruct arg); // déclaration d'une fonction prenant une structure comme argument
On peut aussi noter que le code suivant ne compile que grâce au mot-clé class précédent Test, le mot-clé permet de lever dans le bon sens l'ambiguité :
Code:
1
2
3
4
5
6
7
8
9
10 class Test{}; int Test() {} int main() { class Test test; }
Je ne vois pas pourquoi il y aurait une ambuiguité si je j'enlève le "class" dans
Je declare un objet test de type Test en faisantCode:
1
2
3
4
5
6
7
8
9 class Test{}; int Test() {} int main() { class Test test; }
non ?Code:Test test;
Ce n'est pas si évident pour le compilateur : pour lui Test; est considéré comme une expression demandant l'adresse de la fonction Test(). Donc les deux expression suivantes sont équivalentes(et aussi absurde pour le compilateur l'un que l'autre):
L'interêt est que si, par mégarde, tu déclare un jour un class endl dans l"espace de nom std, ton code ne devrait pas être affecté ;Code:
1
2
3 Test test; (&Test) test;
va compiler.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13 #include <iostream> namespace std { class endl {}; } int main() { std::cout << std::endl; }