Résumé de l'utilisation des variables membres statiques statiques en C ++

La route est entravée et longue, et la file d'attente arrive. Gardez la tête baissée et travaillez dur, si vous ne parlez pas, vous serez un blockbuster! Allez, Sao Nian!

Référence

"C ++ Primer Fifth Edition" page 268, section 7.6: Membres statiques des classes .

"C ++ Primer Fifth Edition" page 250, section 7.3.3: Types de classes .

Début du texte

Pourquoi avez-vous besoin de membres statiques d'une classe?

Parfois, une classe nécessite que certains membres soient directement liés à la classe elle-même, plutôt que de maintenir des associations avec les divers objets de la classe.

Par exemple: une classe de compte bancaire peut avoir besoin d'un membre de données pour représenter le taux d'intérêt de référence actuel.

Dans ce cas, nous espérons le taux d'intérêt directement associé à la classe , et chaque objet n'est pas associé à la classe.

Il peut être vu sous les deux angles suivants:

  • Du point de vue de l'efficacité de la mise en œuvre, il n'est pas nécessaire que chaque objet stocke des informations sur les taux d'intérêt;
  • Plus important encore, une fois que les taux d'intérêt fluctuent, nous voulons que tous les objets utilisent la nouvelle valeur.

Comment déclarer des membres statiques?

Dans une déclaration devant les membres, ajoutez le mot-clé staticpour l'associer à la classe ensemble.

Besoin de prêter attention aux aspects suivants:

  • Les membres statiques peuvent être publicou private.

  • Les types de membres de données statiques peuvent être des constantes, des références, des pointeurs, des types de classe, etc.

  • Les membres statiques de la classe existent en dehors de tout objet et l'objet ne contient aucune donnée liée aux données membres statiques.

Par exemple:

  • Dans la catégorie chien, chaque chien a 4 pattes, alors mon membre peut être associé à cette catégorie;
  • Tous les objets créés par celui-ci peuvent utiliser ce membre (chaque chien créé par celui-ci a 4 pattes);
  • Il n'est pas nécessaire de créer un membre pour chaque chien qui utilise cette classe et de lui dire que vous avez 4 pattes.
  • La fonction membre statique n'est liée à aucun objet ensemble, elles ne contiennent pas de thispointeurs.

  • En conséquence, il ne peut pas être déclaré comme fonction membre statique const, mais nous ne pouvons pas non plus staticutiliser le corps du thispointeur de fonction .

Cette restriction s'applique à la fois l' thisutilisation explicite est également efficace pour utiliser un appel implicite de membres non statiques.

Comment utiliser les membres statiques d'une classe?

Utilisez l'opérateur d'étendue "::" pour accéder directement aux membres statiques.

a::b();

Bien qu'un membre statique n'appartienne pas à un objet de la classe, nous pouvons toujours utiliser l'objet, la référence ou le pointeur de la classe pour accéder au membre statique .

Les fonctions membres peuvent utiliser directement des membres statiques sans passer par des opérateurs d'étendue.

Comment définir des membres statiques?

Vous pouvez définir des fonctions membres statiques à la fois à l' intérieur et à l'extérieur de la classe .

Lorsque le membre statique externe est défini dans la classe, le staticmot clé ne peut pas être répété que la déclaration dans une classe n'apparaît que.

Remarque:

  1. Comme tous les membres d'une classe, lorsque nous pointons vers un membre statique en dehors de la classe, nous devons spécifier le nom de la classe à laquelle appartient le membre.

  2. static Le mot clé n'apparaît que dans l'instruction de déclaration à l'intérieur de la classe.

Étant donné que les membres de données statiques n'appartiennent à aucun objet de la classe, ils ne sont pas définis lorsque l'objet de la classe est créé. Cela signifie qu'ils ne sont pas initialisés par le constructeur de la classe.

De manière générale, nous ne pouvons pas initialiser les membres statiques à l'intérieur de la classe, nous devons définir et initialiser chaque membre statique en dehors de la classe. Comme les autres objets, un membre de données statique ne peut être défini qu'une seule fois.

À l'instar des variables globales, les membres de données statiques sont définis en dehors de toute fonction. Ainsi, une fois défini, il existera toujours dans tout le cycle de vie du programme.

La façon de définir des membres de données statiques est similaire à la définition de fonctions membres en dehors de la classe. Nous devons spécifier le nom de type de l'objet, puis le nom de la classe, l'opérateur de portée et le nom du membre lui-même.

double Account::interestRate = initRate();

Cette instruction définit un interestRateobjet nommé , cet objet est un Accountmembre statique de classe de son type double.

À partir du nom de la classe, le reste de l'instruction de définition est dans la portée de la classe. Par conséquent, nous pouvons utiliser directement la initRate()fonction.

Remarque:

  1. Bien que initRateprivé, nous pouvons également l'utiliser pour l'initialisation interestRate.

  2. Comme la définition des autres membres, interestRatela définition peut également accéder aux membres privés de la classe.

Pour garantir que l'objet n'est défini qu'une seule fois, le meilleur moyen est de placer la définition des membres de données statiques et la définition d'autres fonctions non en ligne dans le même fichier.

Initialisation en classe des membres statiques

Normalement, les membres statiques d'une classe ne doivent pas être initialisés à l'intérieur de la classe. Cependant, il peut fournir un membre statique constdans la classe de la valeur initiale du type entier, mais nécessite qu'un membre statique doit être un type constant littéral constexpr.

La valeur initiale doit être une expression constante, car ces membres eux-mêmes sont des expressions constantes, ils peuvent donc être utilisés dans tous les endroits adaptés aux expressions constantes.

class Account
{
    
    
    public:
        static double rate() {
    
    return interestRate;}
        static void rate(double);
        
    private:
        static constexpr int period = 30;     // period 是常量表达式
        double daily_tbl[period];
};

Même si un membre de données statique constant est initialisé à l'intérieur de la classe, le membre doit généralement être défini en dehors de la classe.

Les membres statiques peuvent être utilisés dans certains scénarios, tandis que les membres ordinaires ne peuvent pas

  • Les membres statiques sont indépendants de tout objet.

  • Dans certaines situations où les membres de données non statiques peuvent être illégaux, les membres statiques peuvent être utilisés normalement.

  • Les membres de données statiques peuvent être des types incomplets (une brève introduction dans les informations étendues).

En particulier, le type d'un membre de données statique peut être le type de la classe à laquelle il appartient. Les membres de données non statiques sont limités et ne peuvent être déclarés que comme des pointeurs ou des références à la classe à laquelle ils appartiennent.

class Bar
{
    
    
    public:
        // ...
    private:
        static Bar mem1;     // 正确:静态成员可以是不完全类型
        Bar *mem2;           // 正确:指针成员可以是不完全类型
        Bar mem3;            // 错误:数据成员必须是完全类型
};

Une autre différence entre les membres statiques et les membres ordinaires est que nous pouvons utiliser des membres statiques comme arguments par défaut.

class Screen
{
    
    
    public:
        // bkground 表示一个在类中稍后定义的静态成员
        Screen& clear(char = bkground);
    private:
        static const char bkground;
};

Un membre de données non statique ne peut pas être utilisé comme argument par défaut, car sa valeur elle-même fait partie de l'objet. Le résultat est qu'un objet ne peut pas être fourni pour obtenir la valeur du membre à partir de lui, ce qui finira par provoquer une erreur!

Informations étendues

Type incomplet

La déclaration des fonctions analogiques peut être séparée de la définition, ou nous pouvons simplement déclarer la classe sans la définir temporairement, comme indiqué ci-dessous:

class Screen;     // Screen 类的声明

Cette instruction est parfois appelée déclaration avant , elle est introduite dans le nom du programme Screenet indique Screenun type de classe.

Pour le type Screen, l'instruction avant qu'elle ne soit définie après un type incomplet , c'est-à-dire qu'à ce moment nous savons qu'il Screens'agit d'un type de classe, mais à la fin, on ne sait pas quels membres sont inclus.

Les types incomplets ne peuvent être utilisés que dans des situations très limitées: vous pouvez définir des pointeurs ou des références à ce type, ou vous pouvez déclarer (mais pas définir) des fonctions qui prennent des types incomplets comme paramètres ou types de retour.

Si le contenu de l'article est erroné, merci de commenter / message privé beaucoup de conseils, merci! Si vous pensez que le contenu de l'article n'est pas mauvais, pensez à cliquer sur trois liens (comme, mettre en signet, laisser un message), votre soutien est mon plus grand encouragement, merci!

Je suppose que tu aimes

Origine blog.csdn.net/Fighting_Boom/article/details/108502836
conseillé
Classement