2012-02-26 19 views
11

Eventuali duplicati:
Why is it an error to use an empty set of brackets to call a constructor with no arguments?Perché il costruttore non viene chiamato quando() viene utilizzato per dichiarare un oggetto?

$ cat cons.cpp 
#include <iostream> 

class Matrix { 
private: 
    int m_count; 

public: 
    Matrix() { 
     m_count = 1; 
     std::cout << "yahoo!" << std::endl; 
    } 
}; 

int main() { 
    std::cout << "before" << std::endl; 
    Matrix m1();       // <---- 
    std::cout << "after" << std::endl; 
} 
$ g++ cons.cpp 
$ ./a.out 
before 
after 
$ 

Che cosa la sintassi Matrix m1(); fare?

Ho creduto che sia lo stesso di Matrix m1;. Ovviamente mi sbaglio.

risposta

12
Matrix m1(); // m1 is a function whose return type is Matrix. 

Anche questa voce di domande frequenti su C++ dovrebbe essere utile.

Is there any difference between List x; and List x();

+1

@Lazer: per convincerti, tenta di utilizzare M1 (ad esempio l'accesso ai m1.m_count) ... – Francesco

+0

In C++ 11 è possibile utilizzare le parentesi graffe per tutte le chiamate del costruttore questo evita l'analisi più irritante del C++, cioè Matrix m1 {}; – mark

+0

Questa non è la "analisi più irritante", l'analisi più irritante si ha quando si tenta di dichiarare, eseguire un oggetto e passare un valore inizializzato temporaneamente a uno o più parametri di costruzione. Per esempio. 'A b (A());'. 'Matrix m1();' è solo una dichiarazione di funzione regolare. –

3

Matrix m1() dichiara una funzione che non accetta parametri e restituisce un Matrix. Si può vedere questo è così con l'aggiunta di un metodo per Matrix e cercando di richiamare su m1:

#include <iostream> 

class Matrix { 
private: 
    int m_count; 

public: 
    Matrix() { 
     m_count = 1; 
     std::cout << "yahoo!" << std::endl; 
    } 
    void foo() {} 
}; 

int main() { 
    std::cout << "before" << std::endl; 
    Matrix m1(); 
    m1.foo(); 
    std::cout << "after" << std::endl; 
} 

error: request for member 'foo' in 'm1', which is of non-class type 'Matrix()'

0

Questo farà quello che stai cercando di fare:

int main() { 
    std::cout << "before" << std::endl; 
    Matrix m1;       // <---- 
    std::cout << "after" << std::endl; 
} 

In C++, se si inizializza una variabile con Parens, in realtà dichiara una funzione che non accetta parametri e restituisce quel tipo.

1

pensare dal punto di vista del linguaggio C:

int data_member(); 

è in realtà un prototipo per la funzione di prendere int vuoto e ritorno. Quando si cambia le cose come:

T data(); 

lo è ancora una dichiarazione di funzione, risintonizzazione T. Quando è necessario dichiararla come variabile, si fa:

T data; // int data;