|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Mar 2003
Città: Rimini
Messaggi: 1843
|
[C++] Esercizio - Qual'è l'output di questo programma?
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 (
![]() Codice:
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; } |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Jan 2012
Messaggi: 1267
|
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:
Codice:
explicit A(int n = 0) { ... } Codice:
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 |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Mar 2003
Città: Rimini
Messaggi: 1843
|
![]() ![]() ![]() ![]() ho capito! ![]() ![]() ![]() ![]() Grazie. |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Jan 2012
Messaggi: 1267
|
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*).
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 13:42.