PDA

View Full Version : [C++] Esercizio - Qual'è l'output di questo programma?


-Ivan-
23-10-2013, 16:42
Ritaglio solo una piccola parte dell'esercizio perchè il resto l'ho capito, non capisco però perchè la chiamata alla funzione f() si possa fare passandogli 3 come parametro quando si aspetta un indirizzo ad un oggetto A come primo parametro ed uno strano coso opzionale (:O ) come secondo parametro.


class A
{
public:
A(int n = 0)
: m_n(n)
{
cout << 'd';
}

A(const A& a)
: m_n(a.m_n)
{
cout << 'c';
}

private:
int m_n;
};

void f(const A &a1, const A &a2 = A())
{
}

int _tmain(int argc, _TCHAR* argv[])
{
f(3);

system("pause");
return 0;
}


L'output qui è dd.

vendettaaaaa
23-10-2013, 16:56
Perchè il costruttore di A, che vuole un parametro (un intero), non è esplicito. Quindi nella funzione f, che si aspetta un oggetto di classe A, passargli un intero causa la creazione implicita di un oggetto A, chiamando il primo costruttore (che scrive la prima d). Proprio per questo motivo di solito i costruttori con un solo argomento sono marcati explicit:
explicit A(int n = 0) { ... }
Solitamente si usano costruttori impliciti quando vuoi convertire un tipo (dal tipo richiesto nell'argomento del costruttore al tipo della classe):
class Complex
{
private:
double real = 0.;
double im = 0.;

public:
Complex(double r) : real(r) { }
};

Complex a = 5.; // A dx dell'uguale viene creato implicitamente un Complex usando il costruttore che setta real = 5., e poi viene assegnato ad a

La seconda d è dovuta al fatto che il secondo parametro è opzionale, ma non nel senso che intendi tu, bensì nel senso che se non gli passi nulla, lui usa il valore di default. Che è un A(), cioè crea un oggetto A senza passargli argomenti, cioè chiama A(n = 0). Questo secondo costruttore scrive la seconda d.

-Ivan-
23-10-2013, 18:08
:cry: :cry: :cry: :cry:
ho capito!
:cry: :cry: :cry: :cry:

Grazie.

vendettaaaaa
23-10-2013, 22:46
Cmq uno dei due costruttori (il copy constructor) non si aspetta, come dici tu nel primo post, un indirizzo ad un oggetto A. const A& è una reference, non un indirizzo (gli indirizzi sono i pointer, A*).