Maison >développement back-end >C++ >Pourquoi les membres de données de classe ne peuvent-ils pas être initialisés à l'aide d'une syntaxe entre accolades ?

Pourquoi les membres de données de classe ne peuvent-ils pas être initialisés à l'aide d'une syntaxe entre accolades ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-16 08:30:03712parcourir

Why Can't Class Data Members Be Initialized Using Brace-Enclosed Syntax?

Pourquoi la syntaxe d'initialisation directe des membres de données de classe est interdite

En C, les membres de données de classe ne peuvent pas être initialisés à l'aide de ( ) syntaxe entre accolades. Considérez le code suivant :

class test {
public:
    void fun() {
        int a(3);
        std::cout << a << '\n';
    }

private:
    int s(3);    // Compiler error
};

La compilation échoue avec des erreurs telles que :

  • "identifiant attendu avant la constante numérique"
  • "attendu ',' ou '. ..' avant la constante numérique"

Alors, pourquoi cette limitation ?

Selon les premières propositions C et les discussions standard, l'interdiction vise à éviter les ambiguïtés d'analyse . Si l'initialisation entre accolades était autorisée, le compilateur pourrait potentiellement mal interpréter les déclarations dans des situations telles que :

struct S {
    int i(x); // data member with initializer
    // Other code
    static int x;
};

Ici, il n'est pas clair si i(x) est un initialiseur de données membre ou une déclaration de fonction membre, comme les deux suivent la même syntaxe.

Pour lever cette ambiguïté, C a opté pour les restrictions suivantes :

  • Les données membres doivent être initialisées à l'aide de la syntaxe = initializer-clause ou { initializer-list } .
  • Les fonctions membres doivent toujours utiliser la syntaxe () {} pour les déclarations.

Cette décision évite les problèmes d'analyse et garantit la clarté du code.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn