Sto studiando la conversione di costruttori e operatori di conversione in C++. Quello che ho imparato finora è che qualsiasi costruttore non esplicito che prende solo un parametro (e qualsiasi numero di argomenti facoltativi di default) rappresenta una conversione di tipo di classe implicita a quel tipo di classe, per esempio se una classe definisce un costruttore che ha un parametro di tipo int
posso usare un int
ovunque sia necessario un oggetto di tale tipo di classe:conversioni implicite da e verso tipi di classe
(supponendo class_type ha un sovraccarico + = operatore)
class_type a;
a+=5;
in questo caso 5 è convertito implicitamente (tramite il costruttore di conversione) a class_type
e viene chiamato l'operatore sovraccarico.
momento, (almeno per me) parte difficile: so di poter definire un operatore di conversione come una funzione membro:
operator int() {....};
che converte l'oggetto della class_type
al int
tipo primitivo, e può usare che la conversione del tipo:
class_type a;
a+5;
in questo caso ho letto che l'oggetto viene convertito in un int attraverso il suo operatore di conversione e quindi l'operatore somma Buil-in si chiama. Ma cosa succede se ho definito un operatore sovraccarico + per prendere due oggetti class_type come argomenti? qualcosa come
class_type operator+(const class_type&,const class_type &c);
come si suppone che il compilatore di sapere quale chiamare con funzione di corrispondenza? la conversione in int
si verifica solo implicitamente quando viene definito solo l'operatore integrato?
grazie!
edit:
in realtà, ho cercato di scrivere del codice per provare in modo efficace fuori, si è scoperto che il mio compilatore (g ++) non emette alcun errore chiamata ambigua!
questo è l'intestazione della classe (insieme con l'operatore non memeber + dichiarazione di funzione):
#include <iostream>
class wrapper {
friend std::ostream &operator<<(std::ostream&,const wrapper&);
public:
wrapper()=default;
wrapper(int);
int get();
operator int() const;
wrapper operator+(int);
private:
int a=10;
};
std::ostream &operator<<(std::ostream&,const wrapper&);
e questo è il codice principale:
#include "wrapper.h"
int main()
{
using namespace std;
wrapper w1;
wrapper w2(5);
cout<<w1<<" "<<w2<<endl;
w1+1;
}
ora, ho definito una conversione costruttore da int
a wrapper
E un operatore di conversione da tipo di classe a int
(Ho anche sovraccaricato l'operatore di output < < per stampare alcuni risultati), ma quando il il compilatore valuta l'espressione w1+1
sembra a posto. Come potrebbe essere ??
Forse leggere [questo riferimento implicito di conversioni] (http://en.cppreference.com/w/cpp/language/implicit_cast) potrebbe essere d'aiuto? –
Inoltre, per l'esempio 'a + = 5' presumo tu intenda che hai sovraccaricato' operator + = 'prendendo' class_type' come argomento? Perché potrebbe facilmente essere stato un sovraccarico prendendo un 'int'. –
Come regola generale, avere sia costruttori impliciti che operatori di conversione impliciti confonde non solo il compilatore ma anche i lettori umani. –