fonctions membres ont un argument implicite qui est l'instance de la classe elle-même. Ainsi, vous pouvez penser à vos fonctions comme la recherche vraiment:
// 1) compile-error as const-qualifications on return doesn't distinguish
// the functions - you cannot overload on return type
int begin(Test&);
const int begin(Test&);
// 2)
int begin(Test&);
const int begin(const Test&);
// 3)
int begin(Test&);
int begin(const Test&);
Avec les 2e et 3e cas, le const
-Qualification la fonction est équivalente à cet argument implicite étant une référence à const. Alors, quand vous avez quelque chose comme:
Test{}.begin();
qui appelle begin()
à l'aide d'une référence à la non-const Test
comme premier argument implicite. Les deux surcharges de begin()
sont viables, les deux ne nécessitent aucune conversion, donc le moins cv référence -qualifiée est préférée, qui est la fonction non-const
-qualified.
Au lieu de cela, lorsque vous avez:
(const Test{}).begin();
que nous appelons begin()
avec une référence à const Test
. Donc la fonction non-qualifiée n'est pas un candidat viable (vous ne pouvez pas passer un const-ref à une fonction qui attend une non-const-ref), donc le meilleur candidat viable est le seul candidat viable: int begin() const
.
Le type du paramètre d'objet implicite est une référence. –
@ T.C. Merci. Je veux toujours que ce soit un pointeur pour une raison quelconque. Je fais souvent cette erreur. – Barry
@Barry Le type de pointeur "this" est * un pointeur *, n'est-ce pas? Pourquoi est-ce une référence dans vos exemples? Pourquoi pas "int begin (Test * this);"? – kotlomoy