Maison >développement back-end >C++ >Les fonctions C peuvent-elles être surchargées uniquement en fonction de la constance des types de valeurs sans pointeur et sans référence ?

Les fonctions C peuvent-elles être surchargées uniquement en fonction de la constance des types de valeurs sans pointeur et sans référence ?

DDD
DDDoriginal
2024-11-17 03:35:03363parcourir

Can C   Functions be Overloaded based solely on the Constness of Non-Pointer, Non-Reference Value Types?

Surcharge de fonctions et arguments Const : un examen plus approfondi

En C, la surcharge de fonctions permet à plusieurs fonctions portant le même nom d'exister dans une classe , tant qu'ils diffèrent dans leurs types de paramètres. Cependant, une situation se présente lorsque l'on tente de surcharger des fonctions basées uniquement sur la constance de types de valeurs sans pointeur et sans référence.

Considérez l'extrait de code suivant :

#include <iostream>
using namespace std;

class Test {
public:
    int foo(const int) const;
    int foo(int);
};

int main ()
{
    Test obj;
    Test const obj1;
    int variable=0;

    obj.foo(3);        // Call the const function
    obj.foo(variable); // Want to make it call the non const function
}

Dans ce qui précède code, une tentative est faite pour surcharger la fonction foo en fonction de la constance de l'argument. Cependant, le compilateur génère une erreur, indiquant que la surcharge de fonctions ne peut pas être effectuée de cette manière.

Comprendre la limitation

La raison de cette limitation réside dans la façon dont la valeur les types sont gérés. Lorsqu'une valeur est transmise par valeur à une fonction, une copie de la valeur est créée et toute modification apportée à cette copie dans la fonction n'affecte pas la valeur d'origine. Par conséquent, la constance de l'argument n'est pertinente que dans le cadre de la fonction.

Par exemple, dans la fonction foo :

int Test::foo(int a)
{
    cout << "NON CONST" << endl;
    a++;
    return a;
}

Même si la fonction n'a pas le mot-clé const , la valeur de a ne peut pas être modifiée car il s'agit d'une copie de la valeur d'origine transmise au function.

Solution

Pour obtenir la fonctionnalité souhaitée, on peut surcharger la fonction foo en fonction de différents types de paramètres. Par exemple, on pourrait surcharger foo pour accepter une référence const à int et une référence non const à int.

#include <iostream>
using namespace std;

class Test {
public:
    int foo(const int &a) const;
    int foo(int &a);
};

int main() {
    Test obj;
    Test const obj1;
    int variable = 0;

    obj.foo(3);        // Call the const function
    obj.foo(variable); // Call the non-const function
}

Cette approche permet une surcharge basée sur les types de paramètres tout en conservant le comportement souhaité par rapport à const-exactitude.

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