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
Libérer: 2024-11-17 03:35:03
original
367 Les gens l'ont consulté

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
}
Copier après la connexion

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;
}
Copier après la connexion

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
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal